問題はこれです:私はリモートマシンからファイルをコピーしたいです。
リモートマシンに接続し、保存されているファイルの場所を取得するシェルスクリプトを作成する方法を探しています。リモートサーバーから場所を切断し、ローカルマシン内からscpを使用して、取得した場所を取得します。ファイルをコピーします。
具体的には、スクリプトからリモートマシンに接続し、そのマシンでタスクを実行する方法を知りたいです。切断し、ローカルで実行を継続します。
ソリューション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ユーザーのホームディレクトリを基準とした、ファイルへのフルパスまたはファイルへの相対パスを標準出力に出力すると想定します。私の例では、スクリプトの名前は「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キーの左側にあるアクセント記号です。
多分、すべての作業を行うリモートマシンでスケジュールされたタスクをトリガーすることが可能です。
これにより、コピーするファイルの場所を検索している間、リモートマシンに接続できなくなります。
私はこれをやっています:
コマンドラインは、私の場合はバッチスクリプトを実行するスケジュールされたタスクをトリガーします。
schtasks /run /s remoteserver /u %user% /p %password% /tn "scheduledtaskname"
宜しくお願いします