scpを使用して1つのUNIXサーバーから別のサーバーにファイルを定期的にコピーし、特定のアクションを実行します。これをすばやく行うには、scpを実行し、scpを完了するために必要なパスワードを入力するUNIXスクリプトを使用したいと思います。
UNIXコマンドラインでパスワードを送信するexpectコマンドを試しましたが、これを達成することはできません。
サンプルコマンド
scp ./abc.txt hostname/abc.txt
expect "*password:*"
send "mypassword\r"
これらのエラーが表示されます。
couldn't read file "password: ": no such file or directory
myscript.sh[5]: send: not found [No such file or directory]
私は何かが欠けていますか?
scp
コマンドの先頭にsshpass -p "your password"
を渡すだけです
sshpass -p "your password" scp ./abc.txt hostname/abc.txt
ssh
、scp
、およびsftp
(すべて同じプロトコルとsshd
サーバーを使用)でログインの問題を回避する方法の1つは、パブリックを作成することです/秘密鍵のペア。
一部のサーバーではこれが許可されていない場合がありますが、ほとんどのサイトでは許可されていません。これらの指示は、Unix/Linux/Mac用です。いつものように、Windowsの cygwin 環境はこれらの手順に従いますが、Windowsはわずかに異なります。
ssh-keygen
を使用して公開/秘密キーを作成します。これはシステムごとに異なる場合がありますが、プログラムがこれをガイドします。ssh-keygen
が完了すると、マシンに$HOME/.ssh
ディレクトリが作成されます。このディレクトリには、公開キーと秘密キーが含まれます。進むにつれて、さらに2つのファイルが生成されます。 1つはknown_hosts
で、これにはログインしたすべての既知のホストのfingerprintsが含まれます。 2番目は、実装に応じてauthorized_keys
またはauthorized_keys2
と呼ばれます。ssh-keygen
も実行します。これにより、$HOME/.ssh
ディレクトリと秘密/公開キーのペアが生成されます。 $HOME/.ssh
ディレクトリが既に存在し、公開鍵ファイルと秘密鍵ファイルがある場合は、これをしないでください。再生成する必要はありません。$HOME/.ssh
ディレクトリのリモートサーバーで、authorized_keys
というファイルを作成します。このファイルに公開鍵を入れます。この公開鍵は、ローカルマシンの$HOME/.ssh
ディレクトリにあります。 *.pub
で終わります。その内容をauthorized_keys
に貼り付けます。 authorized_keys
が既に存在する場合は、次の行に公開キーを貼り付けます。これで、ssh
を使用してログインしたとき、またはscp
またはsftp
を使用したときに、パスワードを入力する必要がなくなります。ところで、2台のマシンのユーザーIDは同意する必要はありません。別のユーザーとして多くのリモートサーバーにログインし、authorized_keys
で公開キーを設定しましたが、そのユーザーに直接ログインしても問題はありません。
Windowsを使用する場合は、ssh
を実行できるものが必要になります。私が知っているほとんどの人は PuTTY を使用して公開/秘密鍵を生成し、リモートでログインするときに key pairing を実行します。すべての手順を思い出すことはできませんが、2つのファイル(1つは公開キーを含み、1つは秘密キーを含む)を生成し、リモートサイトへのログイン時に両方を使用するようにPuTTYを構成します。そのリモートサイトがLinux/Unix/Macの場合、公開キーをコピーしてauthorized_keys
ファイルに入れることができます。
SSH公開/秘密鍵を使用できる場合、スクリプトでパスワードの必要性を排除できます。それ以外の場合、 Expect またはPerlを Net :: SSH とともに使用する必要があります。これらは、プロンプトが表示されたらリモートホストを監視し、パスワードを入力できます。
オープンキーでより良い認証を使用する必要があります。これらの場合、パスワードは必要ありません。
expect
を使用する場合は、このスクリプトを使用します(回答 シェルスクリプトを使用したscpファイル転送の自動化 を参照)。
#!/usr/bin/expect -f
# connect via scp
spawn scp "[email protected]:/home/santhosh/file.dmp" /u01/dumps/file.dmp
#######################
expect {
-re ".*es.*o.*" {
exp_send "yes\r"
exp_continue
}
-re ".*sword.*" {
exp_send "PASSWORD\r"
}
}
interact
また、pexpect
(pythonモジュール)を使用できます。
def doScp(user,password, Host, path, files):
fNames = ' '.join(files)
print fNames
child = pexpect.spawn('scp %s %s@%s:%s' % (fNames, user, Host,path))
print 'scp %s %s@%s:%s' % (fNames, user, Host,path)
i = child.expect(['assword:', r"yes/no"], timeout=30)
if i == 0:
child.sendline(password)
Elif i == 1:
child.sendline("yes")
child.expect("assword:", timeout=30)
child.sendline(password)
data = child.read()
print data
child.close()
// /tmp/abc.txtを/tmp/abc.txt(ターゲットパス)にコピーします
// 10.1.1.2のユーザー名とパスワードは「username」と「password」です
sshpass -p "password" scp /tmp/abc.txt [email protected]:/tmp/abc.txt
// sshpassをインストール(ubuntu)
Sudo apt-get install sshpass
Davidが述べたように、公開/秘密キーを設定する必要があります。
次に、以下のコマンドを使用するとうまくいきました.-iオプションを使用してコマンドで秘密鍵を渡すため、パスワードを要求されませんでした
scp -i path/to/private_key path/to/local/file remoteUserId@remoteHost:/path/to/remote/folder
ここで、path/to/private_keyは、公開/秘密キーのセットアップ中に生成した秘密キーファイルです。