私のFedora 20システムでは、scpを頻繁に使用しています。これは、このコマンドを実行するときにこれに遭遇する2番目の例です。
scp -r -P PORT user@Host:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/
転送する各ファイル/ディレクトリのパスワードを要求します。
user@Host's password: "password here"
質問:
ここで何が起きてるの?
これは正常ですか、これは非常に奇妙な動作だと思いますか?
ローカルシェル(おそらくbash)が拡張されています
user@Host:/home/user/something/{file1,folder1,folder2,folder3,folder4}
に:
user@Host:/home/user/something/file1 user@Host:/home/user/something/folder1 user@Host:/home/user/something/folder2 user@Host:/home/user/something/folder3 user@Host:/home/user/something/folder4
代わりに、次のことができます。
scp -r -P PORT user@Host:"/home/user/something/file1 /home/user/something/folder1 /home/user/something/folder2 /home/user/something/folder3 /home/user/something/folder4" folder/folder2/
または、リモートエンドのユーザーのログインシェルがbashであることがわかっている場合は、ブレース展開も使用できます。
scp -r -P PORT user@Host:"/home/user/something/{file1,folder1,folder2,folder3,folder4}" folder/folder2/
リモートシェルに、文字列をローカルシェルではなく引数に分割させる。
はい、それは正常です。シェルがコマンドを実行する前に中括弧を展開するため、実際に実行しているのは
scp -r -P PORT user@Host:/home/user/something/file1 \
user@Host:/home/user/something/folder1 \
user@Host:/home/user/something/folder3 \
user@Host:/home/user/something/folder4 folder/folder2
基本的に、scp
は複数の接続要求を確認するため、それらのそれぞれに対して新しい接続を開きます。一方通行 最も簡単な方法(@geirhaによって提案されているように引用符を使用すると、1回限りの操作の方が簡単です)これを解決するには、パスワードなしのssh
/scp
を設定します。
$ ssh-keygen
$ ssh-copy-id -p PORT user@Host
これらの2つのコマンドを1回実行すると(必要に応じてプロンプトに応答すると)、将来のすべてのssh接続でパスワードを使用しなくてもssh
/scp
を使用できるようになります。これはi) 実際にはより安全 およびii)muchより便利です。
scp
はそれほどスマートではありません。同じリモートホストからのファイルである複数のコマンドライン引数を指定すると、各引数に対して新しい接続が開かれます。
rsync
の代わりにscp
を使用できます。この方法(および他の方法)の方が賢くなっています。
rsync -r -e 'ssh -P PORT' user@Host:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/
別のアプローチは scp
に単一の引数を渡し、複数のファイルを記述する です。
別のアプローチは、常に認証する必要がないようにシステムをセットアップすることです。できれば、 キー認証のセットアップ を使用することをお勧めします。これは、ほとんどのシナリオでより便利で安全です。別の方法として、またはそれに加えて、 接続共有のセットアップ を使用して、セッションごとに1回認証するだけで済みます。いずれの場合も、毎回ユーザー名とポートを指定する必要がないようにエイリアスを設定します。 ~/.ssh/config
内:
ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r
Host nick
HostName real-Host-name.example.com
User bob
Port 1234
ssh -Nf nick
を実行して接続を開くと、nick
への後続のすべての接続が既存の接続に便乗します。今すぐ実行できます
scp -r nick:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/