を使用してローカルファイルをリモートサーバーにコピーしたいと思いますscp
。
scp -rp local-file my.server.com:/tmp/
場合によっては、リモートサーバーからファイルをコピーする場所を指定することを忘れてしまうことがあります。
scp -rp local-file my.server.com
:
または時には間違って入力することがあります;
。
scp -rp local-file my.server.com;/tmp/
どちらの場合もscp
失敗する必要があります。しかし、代わりに完全に愚かな行動を起こし、ローカルファイルをローカルにコピーしますcp
。
cp local-file my.server.com
でもそうだman scp
と言った。それでは、なぜ自動的に失敗し、このように動作しますか?scp
remote file copy program
cp
この問題に対する解決策はありますか?
私のバージョンopenssh-client
は1:6.0p1-4+deb7u6
答え1
Bashでは、このようなラッパー関数を作成できます。
function scp {
if grep -q ':[^ $]' <<< "$*" ; then
command "${FUNCNAME[0]}" "$@"
else
echo "missing or invalid hostname:path in scp command"
return 1
fi
}
ここに非常に粗雑な例があります。コマンドラインに空白以外の文字が1つ以上あることを確認するだけです:
(これは概念証明の例には十分ですが、実際の使用には十分ではありません)。存在する場合はscp
コマンドを実行します。それ以外の場合は、エラーメッセージを出力して終了コード1を返します。
あるいは、スクリプトを書くこともできます。どちらにも違いはありません。
ところで、上で「in bash」と言っていましたが、その理由は上記の機能をbashでのみテストしたからです。これはbashだけがこれを行うことができるという意味ではありません。他のほとんどのsh実装では、同じまたは類似の操作を実行できます。構文は若干異なる場合があり、command scp ...
より一般的な構文の代わりにハードコードする必要がありますcommand "${FUNCNAME[0]} ..."
。
PS:私はscpがこれを「しなければならない」かどうか判断しません。自分のシステムを決定することはあなた次第です。しかし、すべてのカスタムハッキング/松葉杖なしでシステムで作業する必要がある場合、そのようなものに頼ることは深刻な不利益をもたらします。
答え2
短い答えはできないということです。
man scp
リモートホストはオプションと呼ばれます。
scp (scp オプションが削除されました) [[user@]host1:]file1 ... [[user@]host2:]file2
今コマンドを実行すると
scp arg1 arg2
scp
:
またはを調べて、arg1
リモートホストがどこにあるかを判断しますarg2
(2つのリモートホスト(solaris、ubuntu)を許可することもできますが、必ずしもそうではありません)。
arg1
、arg2
コロンがすべてない場合は、scp
を押しますcp
。
答え3
他の回答に加えて、scp
別のプロトコルではないことに注意してくださいそれ自体しかし、暗号化されていないものではなく、転送用rcp
に古いものです。これはドロップイン交換用に設計されており、スクリプトの有無にかかわらずすべてを変更せずに安全なものに置き換えることができます。解析を許可します。ssh
TCP
rcp
scp
rcp
:
答え4
リモートファイルコピープログラムとはいえ、リモート要求だけでなくローカルコピー要求も処理できるように設計されたようです。この動作はテスト時の私の環境にも反映されました。
ローカルで実行した後、環境変数$?から値を取得するときに戻りコード0が観察されたことにも注意する価値があります。これは期待通りに動作し、エラーコードが出力されないことを示しています。
残念ながら、この基本的な動作を解決する方法があるかどうかはわかりません。他のツールを使用することは唯一の選択肢かもしれません。