web-dev-qa-db-ja.com

シェルスクリプトを使用してscpファイル転送を自動化する

UNIXシステムのディレクトリにn個のファイルがあります。 scpを介してすべてのファイルを指定されたリモートシステムに転送するシェルスクリプトを作成する方法はありますか。スクリプト内でパスワードを指定するので、ファイルごとにパスワードを入力する必要はありません。

80
jimko

シェルスクリプトでパスワードをハードコーディングする代わりに、簡単で安全なSSHキーを使用します。

$ scp -i ~/.ssh/id_rsa [email protected]:/path/to/bin/*.derp .

秘密鍵が~/.ssh/id_rsaにあると仮定します

公開/秘密キーのペアを生成するには:

$ ssh-keygen -t rsa

上記は2つのファイル、~/.ssh/id_rsa(秘密鍵)と~/.ssh/id_rsa.pub(公開鍵)を生成します

使用のためにSSHキーを設定するには(1回限りのタスク):~/.ssh/id_rsa.pubの内容をコピーし、~devops/.ssh/authorized_keysサーバーのmyserver.orgの新しい行に貼り付けます。 ~devops/.ssh/authorized_keysが存在しない場合は、お気軽に作成してください。

明快なハウツーガイドが利用可能です こちら

84
Pradeep Pati
#!/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

http://blogs.Oracle.com/SanthoshK/entry/automate_linux_scp_command

40
JohnA

なぜこれを試してみませんか?

password="your password"
username="username"
Ip="<IP>"
sshpass -p "$password" scp /<PATH>/final.txt [email protected]$Ip:/root/<PATH>
15
Veerendra

rsyncを使用することもできます。複数のファイルの場合、scp IMHOよりもうまく機能するようです。

rsync -avzh/path/to/dir/user @ remote:/ path/to/remote/dir /

更新

'-e'スイッチを追加することで、ssh経由でrsyncを使用できます。

rsync -avzh -e ssh/path/do/dir/user @ remote:/ path/to/remote/dir /
15
bsisco
#!/usr/bin/expect -f
spawn scp -r BASE.Zip [email protected]:/tmp
expect "password:"
send "wifinetworks\r"
expect "*\r"
expect "\r"
9
Abhinav Gupta

ワイルドカードや複数のファイルはどうですか?

scp file1 file2 more-files* [email protected]:/some/dir/
5
lutz

rsyncは、rcpとほぼ同じように動作するプログラムですが、さらに多くのオプションがあり、rsyncリモート更新プロトコルを使用して、宛先ファイルが更新されているときのファイル転送を大幅に高速化します。

Rsyncリモート更新プロトコルにより、rsyncは、このパッケージに付属する技術レポートで説明されている効率的なチェックサム検索アルゴリズムを使用して、ネットワーク接続を介して2組のファイル間の差分のみを転送できます。


ある場所から別の場所にフォルダーをコピーする

   #!/usr/bin/expect -f   
   spawn rsync -a -e ssh [email protected]:/cool/cool1/* /tmp/cool/   
   expect "password:"   
   send "cool\r"   
   expect "*\r"   
   expect "\r"  
4
K.Govind Anupam

スクリプトを実行するたびにパスワードを1回入力しても問題ない場合は、SSHマスター接続を使用して簡単に入力できます。

#!/usr/bin/env bash

USER_AT_Host="[email protected]"  # use "[email protected]$2" here if you like
SSHSOCKET=~/".ssh/$USER_AT_Host"

# This is the only time you have to enter the password:
# Open master connection:
ssh -M -f -N -o ControlPath="$SSHSOCKET" "$USER_AT_Host"

# These do not Prompt for your password:
scp -o ControlPath="$SSHSOCKET" file1.xy "$USER_AT_Host":remotefile1.xy
scp -o ControlPath="$SSHSOCKET" file2.xy "$USER_AT_Host":remotefile2.xy

# You can also use the flag for normal ssh:
ssh -o ControlPath="$SSHSOCKET" "$USER_AT_Host" "echo hello"
ssh -o ControlPath="$SSHSOCKET" "$USER_AT_Host" "echo world"

# Close master connection:
ssh -S "$SSHSOCKET" -O exit "$USER_AT_Host"
3
Felix Rabe

Ssh公開/秘密鍵でのみ実行できます。または、パスワードを設定できるPuTTYを使用します。 scpは、コマンドラインでのパスワードの提供をサポートしていません。

公開/秘密キーの手順については、こちらをご覧ください: http://www.softpanorama.org/Net/Application_layer/SSH/scp.shtml

2
Vereb

これは動作します:

#!/usr/bin/expect -f

spawn scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no file1 file2 file3 [email protected]:/path/
expect "password:"
send "xyz123\r"
expect "*\r"
expect "\r"
interact
1
Rishi Sinha

これは、.pemキーファイルを使用したSCPのbashコードです。それをscript.shファイルに保存し、「sh script.sh」で実行するだけです

楽しい

#!/bin/bash
#Error function
function die(){
echo "$1"
exit 1
}

Host=ec2-53-298-45-63.us-west-1.compute.amazonaws.com
User=ubuntu
#Directory at sent destination
SendDirectory=scp
#File to send at Host
FileName=filetosend.txt
#Key file
Key=MyKeyFile.pem

echo "Aperture in Process...";

#The code that will send your file scp
scp -i $Key $FileName [email protected]$Host:$SendDirectory || \
die "@@@@@@@Houston we have problem"

echo "########Aperture Complete#########";
1
Chief_Arbiter

Lftpを試す

lftp -u $user,$pass sftp://$Host << --EOF--

cd $directory

put $srcfile

quit

--EOF--
0
azazil

少なくとも私にとっては、 この答え は機能しなかったと言えます。そして、私はそれを解決することをあまり混乱させたくありませんでした。そこで、私は Digital Ocean でうまく機能する素敵なガイドを見つけました。主な違いは、手動コマンドではなく、ssh-copy-idを使用して公開キーをサーバーに転送することだったと思います。

0
Ignas