web-dev-qa-db-ja.com

scpを使用してサーバー間でファイルをコピーするときにパスワードを送信する

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]

私は何かが欠けていますか?

11
cherry2891

scpコマンドの先頭にsshpass -p "your password"を渡すだけです

sshpass -p "your password" scp ./abc.txt hostname/abc.txt
21
Akki

sshscp、および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で秘密公開鍵認証を行う

Windowsを使用する場合は、sshを実行できるものが必要になります。私が知っているほとんどの人は PuTTY を使用して公開/秘密鍵を生成し、リモートでログインするときに key pairing を実行します。すべての手順を思い出すことはできませんが、2つのファイル(1つは公開キーを含み、1つは秘密キーを含む)を生成し、リモートサイトへのログイン時に両方を使用するようにPuTTYを構成します。そのリモートサイトがLinux/Unix/Macの場合、公開キーをコピーしてauthorized_keysファイルに入れることができます。

SSH公開/秘密鍵を使用できる場合、スクリプトでパスワードの必要性を排除できます。それ以外の場合、 Expect またはPerlを Net :: SSH とともに使用する必要があります。これらは、プロンプトが表示されたらリモートホストを監視し、パスワードを入力できます。

6
David W.

オープンキーでより良い認証を使用する必要があります。これらの場合、パスワードは必要ありません。

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()
4
Igor Chubin

// /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
2
KunMing Xie

Davidが述べたように、公開/秘密キーを設定する必要があります。

次に、以下のコマンドを使用するとうまくいきました.-iオプションを使用してコマンドで秘密鍵を渡すため、パスワードを要求されませんでした

scp -i path/to/private_key path/to/local/file remoteUserId@remoteHost:/path/to/remote/folder

ここで、path/to/private_keyは、公開/秘密キーのセットアップ中に生成した秘密キーファイルです。

2
Manjunath D R