scpを必要に応じて動作させる(リモートファイルコピープログラム)

scpを必要に応じて動作させる(リモートファイルコピープログラム)

を使用してローカルファイルをリモートサーバーにコピーしたいと思います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と言った。それでは、なぜ自動的に失敗し、このように動作しますか?scpremote file copy programcp

この問題に対する解決策はありますか?

私のバージョンopenssh-client1: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)を許可することもできますが、必ずしもそうではありません)。

arg1arg2コロンがすべてない場合は、scpを押しますcp

答え3

他の回答に加えて、scp別のプロトコルではないことに注意してくださいそれ自体しかし、暗号化されていないものではなく、転送用rcpに古いものです。これはドロップイン交換用に設計されており、スクリプトの有無にかかわらずすべてを変更せずに安全なものに置き換えることができます。解析を許可します。sshTCPrcpscprcp:

答え4

リモートファイルコピープログラムとはいえ、リモート要求だけでなくローカルコピー要求も処理できるように設計されたようです。この動作はテスト時の私の環境にも反映されました。

ローカルで実行した後、環境変数$?から値を取得するときに戻りコード0が観察されたことにも注意する価値があります。これは期待通りに動作し、エラーコードが出力されないことを示しています。

残念ながら、この基本的な動作を解決する方法があるかどうかはわかりません。他のツールを使用することは唯一の選択肢かもしれません。

関連情報