scpでコピーするときにワイルドカード(*)を使用する方法は?


144

*パスで文字を使用しているときにscpでコピーできないのはなぜですか?

scp SERVERNAME:/DIR/* .

SCPが*パスで許可するために必要な構成は何ですか?

更新:問題はサーバー側ではありません。pscpはSCPv1を使用しようとしているため、エラーメッセージが表示されます。

*というファイルに関するscpコマンドラインとエラーメッセージ


これを確認してください、それは私のために働いた:https
//superuser.com/a/1390405/445746

回答:


126

scpリモートマシン*がグロブとして処理されるのを避けるために、リテラルエスケープを渡す必要があります(二重引用符で囲まれていることに注意してください)。

scp 'SERVERNAME:/DIR/\*' .

41
引用符またはスターの前にバックスラッシュが必要です。両方ではありません。scpはそれを拡張するものではなく、シェルです。
パトリック

3
試しましたか?説明したとおりに機能します(引用とエスケープは失敗します)。User1274964は、回答で動作を確認します。touch /tmp/abcd.1234; scp 'localhost:/tmp/abcd.\*' ./scp: /tmp/abcd.*: No such file or directory
パトリック

2
@Patrick問題は、リテラルアスタリスクを使用すること、つまり、グロビングを完全に回避することに関するものであり、リモートでのグロブの方法に関するものではありません。
クリスダウン

2
実は質問は得ることについてであるpscpリモートグロブを許可するようにクライアント側で。
パトリック

1
単一引用符を使用している場合は、アスタリスクをエスケープする必要はありません
Led

52

クリスの答えは私を正しい道に導いたが、私はパトリックのアドバイスが正しいことがわかった。引用符を使用すると、アスタリスクの前にバックスラッシュは不要です。

scp 'SERVERNAME:/tmp/file_num\*' .

scp:/tmp/file_num*.csv:そのようなファイルまたはディレクトリはありません

scp 'SERVERNAME:/tmp/file_num*' .

judges_for_job_171642.csv 100%32KB 32.0KB / s 00:00
decisions_for_job_172394.csv 100%548KB 182.6KB / s 00:03


4
これは、あなたがいることを意味するので、右たいリモコンのグロブします。問題は、(リテラルを取得するために)リモートでのグロビングを停止*する方法に関するものであり、リモートでのみグロブする方法に関するものではありません。
クリスダウン

3
@ChrisDown。いいえ。ユーザーは、ホストで展開されないワイルドカードを望み、リモートで展開され、そこで複数のファイルと一致できるようにします。返されるファイルには、リテラル「*」が含まれていません。「ホストでグロブするのをやめる」という意味ですか?
ティムバード

1

注:以下で提供されるソリューションはテスト済みであり、正しく機能することが確認されています。

グロブするパスの一部にエイリアスを設定している場合、重引用符は変数の展開を中断します。

ここで使用するスクリプトですDOUBLE展開されたファイル名のユースケースのための引用符のコマンドconfigure_の * .tar.gzの変数とエイリアスパスを使用しては:

#!/bin/bash

USEREXECUTINGSCRIPT='admin'
SCRIPTSDIR="myscripts"

SCPUSER='terrencehoulahan'
SCPUSERPASSWD='Change-Me'
SCPHOST='1.2.3.4'
SCPDIRECTORYREMOTE='/Users/terrencehoulahan/Downloads/Ubuntu/18.04'

## Uncomment appropriate below command for your distro to install "sshpass"
#apt-get -y sshpass
#yum -y install sshpass

sshpass -p "$SCPUSERPASSWD" scp -o StrictHostKeyChecking=no $SCPUSER@$SCPHOST:"$SCPDIRECTORYREMOTE/command-configure_*.tar.gz" $(getent passwd|grep ^$(echo $USEREXECUTINGSCRIPT)|cut -d ':' -f6)/$SCRIPTSDIR/

二重引用符を閉じた後、指定されたユーザーのホームディレクトリを/ etc / passwdから抽出するだけで、ローカルディレクトリターゲットが構築されます

scpコマンド自体の前にはsshpass、ユーザーの操作なしでコマンド-o StrictHostKeyChecking=noを完全に自動化するためのものscpがあります。複雑に見えますが、時々変化することが予想されるハードコーディングパスよりも優れています。

Anyhoo、グロブするパスの変数を展開する必要がある二重引用符を使用した例。HTH

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.