
私の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"
質問:
ここで何が起こっているのでしょうか?
これは普通ですか?この行動を非常に奇妙な行動と見なすことはできますか?
答え1
ローカルシェル(おそらく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/
リモートシェルが文字列をローカルシェルの代わりに引数に分割するようにします。
答え2
はい、これは正常です。何が起こっているのかシェルがコマンドを実行する前に中かっこを拡張するので、実際に実行しているのは次のとおりです。
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が提案した引用符を使用することは、ワンタイムタスクの場合は簡単です。)この問題に対する解決策は、パスワードなしssh
/を設定することですscp
。
$ ssh-keygen
$ ssh-copy-id -p PORT user@host
ssh
これら2つのコマンドを一度実行し、必要に応じてプロンプトに応答すると、パスワードを有効または無効にすることなく、将来のすべてのscp
SSH接続を確立できます。これは私です)実際にはより安全ですそしてii)たくさんより便利です。
答え3
scp
それほどスマートではありません。同じリモートホスト上のファイルに対して複数のコマンドライン引数が与えられると、各引数に対して新しい接続が開きます。
rsync
代わりにscp
(何よりも)よりスマートなを使用することができます。
rsync -r -e 'ssh -P PORT' user@host:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/
別の方法はscp
複数のファイルを記述するパラメータ渡し。
別のアプローチは、常に認証する必要がないようにシステムを設定することです。楽しむ、鍵認証の設定、これはほとんどのシナリオでより便利で安全です。または、あるいは、接続共有の設定したがって、セッションごとに一度だけ認証するだけです。とにかく、毎回ユーザー名とポートを指定する必要がないようにエイリアスを設定してください。あなたの~/.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/