web-dev-qa-db-ja.com

1つのコマンドでローカルの複数のディレクトリからリモートの複数のディレクトリにあるscpファイル

複数のローカルディレクトリから複数のリモートディレクトリにいくつかのファイルをコピーする必要があります。

コマンド:

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つの宛先ディレクトリに配置します。

しかし、私の宛先はすべてのファイルで異なります。

8
romil gaurav

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
1
Costas

コマンドにわずかな変更を加えるだけで、以下のように実現できます。

あなたがsource1, source2 ..「file」フォルダ内のフォルダ。以下のように実行して、これらすべてのフォルダをコピーできますsource1, source2 ..宛先サーバーに。

scp -r /source/file username@Host_server:/file/destination1

これにより、フォルダーが作成されますsource1, source2とその内容を、宛先パスにあるそれぞれのフォルダーにコピーします/file/destination1ターゲットサーバー上。

0
Arindom
  1. 繰り返されるパスワードプロンプトを回避するには、パスワードベースではなく、キーベースの認証を使用します。

    例えばローカルマシンでssh-keygenを実行し、リモートホストごとにssh-copy-id user@remotehostを実行します。そのマシンからsshまたはscpを実行するときにパスワードを入力する必要があるのは、これが最後です。

    鍵に適切なパスフレーズを使用し、ssh-agentまたは同様のものを実行します。そうすれば、ログインセッションで初めて使用するときに、秘密鍵のパスフレーズを入力するだけで済みます。

  2. 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でも同じことができますが、scpsを実行するには、ホストの外部ループと内部ループが必要です。また、pdcpは、一度に1つではなく、複数のマシンに並行してコピーします。

    pdsh(およびpdcp)を使用すると、マシンのグループに任意の名前を構成できます。すべての計算ノードはcompute-nodesグループ、すべてのWebサーバーはwebグループ、データベースサーバーはdb、すべてのホストはグループallなどにあります。

    その後、次のようなことができます:

    pdsh -g web 'uname -a ; uptime'またはpdcp -g web,db /etc/motd /etc/

0
cas