UNIXシステムのディレクトリにn個のファイルがあります。これらすべてのファイルをscp経由で指定されたリモートシステムに転送するシェルスクリプトを作成する方法はありますか?スクリプト内でパスワードを指定するので、ファイルごとにパスワードを入力する必要はありません。
回答:
シェルスクリプトでパスワードをハードコーディングする代わりに、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_keys
myserver.org
~devops/.ssh/authorized_keys
#!/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
expect
MSYS2にパッケージ化されているものは出力全体と一致するため、最初のルールは常に一致します。両方のルールの順序を交換すると、目的の動作が得られます。
これを試してみませんか?
password="your password"
username="username"
Ip="<IP>"
sshpass -p "$password" scp /<PATH>/final.txt $username@$Ip:/root/<PATH>
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 /
ワイルドカードや複数のファイルはどうですか?
scp file1 file2 more-files* user@remote:/some/dir/
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"
スクリプトを実行するたびにパスワードを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"
sshの公開鍵/秘密鍵でのみ実行できます。または、パスワードを設定できるパテを使用します。scpは、コマンドラインでのパスワードの指定をサポートしていません。
公開鍵/秘密鍵の手順については、http: //www.softpanorama.org/Net/Application_layer/SSH/scp.shtmlを参照してください。
これは、.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#########";
このコマンドscp
は、従来のUNIXと同じように使用できますcp
。だからあなたがするなら:
scp -r myDirectory/ mylogin@host:TargetDirectory
動作します