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


83

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


2
rsyncでシェルスクリプトでパスワードを使用することが機能したかどうか、またはそれを試したかどうかを教えてください。ありがとう。

回答:


88

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

$ scp -i ~/.ssh/id_rsa *.derp devops@myserver.org:/path/to/target/directory/

秘密鍵がに~/.ssh/id_rsaあり、送信したいファイルをでフィルタリングできると仮定します*.derp

公開鍵と秘密鍵のペアを生成するには:

$ ssh-keygen -t rsa

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

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

わかりやすいハウツーガイドはこちらから入手できます


1
これらの指示に従った後でも、パスワードの入力を求められます...他に不足している基準はありますか?
scottysseus 2015

@ScottScooterWeidenkopf .ssh dirやauthorized_keysファイルに適切な権限(700)がないなど、間違っている可能性のあることがいくつかあります。
Pradeep Pati 2015

2
@PradeepPati私は自分の問題を理解しました。そうです、問題は許可でした。あなたが提供したリンクの中で、作者はいくつかの許可の変更について言及しました。私はそれらの変更を行いました、そして今すべてがうまくいきます。
scottysseus 2015

1
このソリューションのコピーアンドペーストの使用法との混同を避けるために、現在、この回答はリモートからローカルに転送されているようです。これは、OPが実行しようとしていることとは逆です。
シアバロス

@Ciabarosグッドキャッチ!答えを更新しました。ありがとう!
Pradeep Pati

42
#!/usr/bin/expect -f

# connect via scp
spawn scp "user@example.com:/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


Windowsユーザーへの注意:expectMSYS2にパッケージ化されているものは出力全体と一致するため、最初のルールは常に一致します。両方のルールの順序を交換すると、目的の動作が得られます。
fzbd

18

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

password="your password"
username="username"
Ip="<IP>"
sshpass -p "$password" scp /<PATH>/final.txt $username@$Ip:/root/<PATH>

1
#!/ usr / bin / expect -fの
優れた

16

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

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 /

3
scpの良いところは、安全なチャネルを使用することです。rsyncはしません。

3
rsyncにsshの使用を強制できます: 'rsync -avz -e ssh remoteuser @ remotehost:/ remote / dir / this / dir /'

@flokra。おかげで、私はその更新を追加している最中で、気が散ってしまいました。
bsisco 2009

9
これにより、インタラクティブなパスワードプロンプトが引き続き呼び出されます。OPは完全に自動化されたソリューションを望んでいたと思います
Tom Auger 2011

@Dimitri scp -rは、ファイルを再帰的にコピーします。スクリプト内にパスワードを保存し、それをbashスクリプトを介してscp呼び出しに渡すこととは何の関係もありません。私はあなたのコメントを本当に理解していません。
トムオージェ2011

9
#!/usr/bin/expect -f
spawn scp -r BASE.zip abhishek@192.168.1.115:/tmp
expect "password:"
send "wifinetworks\r"
expect "*\r"
expect "\r"

rsyncに使用できると期待できますか?何かをしようとしていますが、RSAキー方式が機能していません。リモートマシンのパスワードを要求され続けます。

5

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

scp file1 file2 more-files* user@remote:/some/dir/

4

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

rsyncリモートアップデートプロトコルにより、rsyncは、このパッケージに付属するテクニカルレポートに記載されている効率的なチェックサム検索アルゴリズムを使用して、ネットワーク接続を介して2セットのファイル間の違いだけを転送できます。


ある場所から別の場所へのフォルダのコピー

   #!/usr/bin/expect -f   
   spawn rsync -a -e ssh username@192.168.1.123:/cool/cool1/* /tmp/cool/   
   expect "password:"   
   send "cool\r"   
   expect "*\r"   
   expect "\r"  

3

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

#!/usr/bin/env bash

USER_AT_HOST="user@host"  # use "$1@$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"


1

これは機能します:

#!/usr/bin/expect -f

spawn scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no file1 file2 file3 user@host:/path/
expect "password:"
send "xyz123\r"
expect "*\r"
expect "\r"
interact

1

これは、.pemキーファイルを使用したSCPのbashコードです。それをscript.shファイルに保存し、「shscript.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 $User@$Host:$SendDirectory || \
die "@@@@@@@Houston we have problem"

echo "########Aperture Complete#########";

0

lftpをお試しください

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

cd $directory

put $srcfile

quit

--EOF--

-1

このコマンドscpは、従来のUNIXと同じように使用できますcp。だからあなたがするなら:

scp -r myDirectory/ mylogin@host:TargetDirectory

動作します


1
これはパスワードに対応しているようには見えません。
Delicia Brummitt 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.