回答:
解決策1:
remote_output="$(ssh user@host "remote command")"
scp "user@$host:$remote_output" /local/path
これは、リモートマシンに接続し、いくつかのコマンドを実行し、出力をローカルマシンの変数にコピーすることで機能します。たとえば、ファイルパスをリモートでエコーし、ローカルでキャプチャするとします。
解決策2:
ssh user@host "determine_path; cat filename" >local_filename
これは、リモートから直接ファイルを見つけて出力し、ローカルにファイルにリダイレクトすることで機能します。これはscpをスキップします。これには、「cat」の前のステップに出力がないことが必要です(これは&> / dev / nullで解決できます)。
次の形式でスクリプトを記述できます。
command1
command2
...
ssh user@machine command3
...
command4
command5
command3
パスワードを要求せずに実行されるようにするには、SSHキーをセットアップする必要があります。
ssh user@remote command3
実行中はcommand4
開始できません
ssh user@machine command3 &
コピーしたいファイルをどのように特定するかについてすでにある程度の考えがあり、この特定を行うリモートマシン上で実行するスクリプトまたはコマンドセットを記述できるか、すでに記述していると思います。 。
さらに、これらのコマンドは、コピーに使用されているSSHユーザーのホームディレクトリからの相対パスである、ファイルへのフルパスまたはファイルへの相対パスを標準出力に出力すると仮定します。私の例では、スクリプトの名前は "getfilepath.sh"ですが、シェルスクリプトである必要はありませんが、他の実行可能ファイルや一連のコマンドである可能性もあります。
# Script to be executed on local machine.
# put any leading local commands here.
FILE=$(ssh user@emote getfilepath.sh);
scp user@remotehost:"$FILE" .
# put any trailing local commands here.
上記のコードでは、「$()」表記は、コマンドの標準出力をシェル変数としてキャプチャする方法です。これはかなり標準的ですが、それを理解できないシェルを使用している場合は、代わりにコマンドを「バックティック」で囲むことができます。これは、ほとんどのUSキーボードの1キーの左側にあるアクセント記号です。