web-dev-qa-db-ja.com

ダウンロード用に選択したファイルとディレクトリを含むSCPコマンドは、新しいファイルまたはディレクトリごとにパスワードを要求します

私の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"

質問:

ここで何が起きてるの?

これは正常ですか、これは非常に奇妙な動作だと思いますか?

9

ローカルシェル(おそらく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/

リモートシェルに、文字列をローカルシェルではなく引数に分割させる。

13
geirha

はい、それは正常です。シェルがコマンドを実行する前に中括弧を展開するため、実際に実行しているのは

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より便利です。

5
terdon

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/