複数のローカルディレクトリから複数のリモートディレクトリにいくつかのファイルをコピーする必要があります。
コマンド:
scp -v /file/source1/* username@Host_server:/file/destination1
scp -v /file/source2/* username@Host_server:/file/destination2
scp -v /file/source3/* username@Host_server:/file/destination3
パスワードを何度も要求します。
コマンド:
scp file1 file2 ... fileN user@Host:/destination/directory/
すべてのファイルを1つの宛先ディレクトリに配置します。
しかし、私の宛先はすべてのファイルで異なります。
1つのscp
コマンドに複数の宛先を含めることはできません。単一のSSH接続を作成する場合は、他のツールを使用する必要があります。
最も簡単な解決策は、リモートファイルシステムを [〜#〜] sshfs [〜#〜] にマウントしてから、cp
コマンドを使用することです。 。これにはSFTPアクセスが必要です。
mkdir Host_server
sshfs username@Host_server:/file Host_server
cp /file/source1/* Host_server/destination1
cp /file/source2/* Host_server/destination2
cp /file/source3/* Host_server/destination3
fusermount -u Host_server
rmdir Host_server
別の解決策は、最初にファイルをローカルに整理し、次に階層をコピーすることです。これにはrsyncが必要です。
mkdir destination1 destination2 destination3
ln -s /file/source1/* destination1
ln -s /file/source2/* destination2
ln -s /file/source3/* destination3
rsync -a --copy-unsafe-links destination1 destination2 destination3 username@Host_server:/file
rm -r destination1 destination2 destination3
別の解決策は、scp
を使い続けることですが、最初にサーバーへのマスター接続を開きます。これについては、 すでに確立されているSSHチャネルの使用で説明されています
または、それに耐え、3つのscp
接続を作成します。ただし、ログインにパスワードを使用しないでください。代わりに、鍵ペアを作成し、秘密鍵を鍵エージェント(ssh-add ~/.ssh/id_rsa
)の場合、接続ごとに何も入力する必要はありません。
scpはデータ転送にsshを使用し、sshと同じ認証を使用し、同じセキュリティを提供します。 rcpとは異なり、scpは、認証に必要な場合にパスワードまたはパスフレーズを要求します。だからあなたはできる:
1。 Settle sshリモートsshd_config
のような編集による公開鍵経由の接続
# Should we allow Identity (SSH version 1) authentication?
RSAAuthentication yes
# Should we allow Pubkey (SSH version 2) authentication?
PubkeyAuthentication yes
# Where do we look for authorized public keys?
# If it doesn't start with a slash, then it is
# relative to the user's home directory
AuthorizedKeysFile .ssh/authorized_keys
キーペアを生成する
localhost$ ssh-keygen -t rsa
そしてそれをリモートホストに送信します
localhost$ scp ~/.ssh/id_rsa.pub [email protected]
localhost$ ssh [email protected]
remote.server.Host$ [ -d ~/.ssh ] || (mkdir ~/.ssh; chmod 700 ~/.ssh)
remote.server.Host$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
remote.server.Host$ chmod 600 ~/.ssh/authorized_keys
または
2。 [安全でない] Setpasswordlessリモートホストユーザー
または
3。 expect
でスクリプトを使用する
#!/usr/bin/expect
stty -echo
send_user -- "Enter Password: "
expect_user -re "(.*)\n"
send_user "\n"
stty echo
set PASS $expect_out(1,string)
…
spawn scp -v /file/source1/* username@Host_server:/file/destination1
expect "assword:"
send $PASS"\r"
expect eof
コマンドにわずかな変更を加えるだけで、以下のように実現できます。
あなたがsource1, source2
..「file」フォルダ内のフォルダ。以下のように実行して、これらすべてのフォルダをコピーできますsource1, source2 ..
宛先サーバーに。
scp -r /source/file username@Host_server:/file/destination1
これにより、フォルダーが作成されますsource1, source2
とその内容を、宛先パスにあるそれぞれのフォルダーにコピーします/file/destination1
ターゲットサーバー上。
繰り返されるパスワードプロンプトを回避するには、パスワードベースではなく、キーベースの認証を使用します。
例えばローカルマシンでssh-keygen
を実行し、リモートホストごとにssh-copy-id user@remotehost
を実行します。そのマシンからssh
またはscp
を実行するときにパスワードを入力する必要があるのは、これが最後です。
鍵に適切なパスフレーズを使用し、ssh-agent
または同様のものを実行します。そうすれば、ログインセッションで初めて使用するときに、秘密鍵のパスフレーズを入力するだけで済みます。
pdcp
パッケージのpdsh
を使用します。例えば:
pdcp -w Host1,Host2,Host3 /path/to/source/file /path/on/destination/
または、ホスト名がパターンに一致する場合:
pdcp -w Host[1-3] /path/to/source/file /path/on/destination/
複数の宛先を指定することはできませんが、複数のソースを指定することはできます。例えばpdcp -w h1,h2,h3 file1 file2 file3 /remote-path/
は各マシンの/ remote-path /ディレクトリにコピーします(そのディレクトリがないターゲットマシンはエラーメッセージを出力します)
複数のホスト上の異なるディレクトリに複数のソースファイルをコピーする必要がある場合は、forループラッパーを使用できます。旧式のscp
でも同じことができますが、scp
sを実行するには、ホストの外部ループと内部ループが必要です。また、pdcp
は、一度に1つではなく、複数のマシンに並行してコピーします。
pdsh
(およびpdcp
)を使用すると、マシンのグループに任意の名前を構成できます。すべての計算ノードはcompute-nodes
グループ、すべてのWebサーバーはweb
グループ、データベースサーバーはdb
、すべてのホストはグループall
などにあります。
その後、次のようなことができます:
pdsh -g web 'uname -a ; uptime'
またはpdcp -g web,db /etc/motd /etc/