web-dev-qa-db-ja.com

リモートコンピュータからデータをコピー、実行、取得するにはどうすればよいですか?

リモートコンピューターでいくつかの計算を実行しようとしています。基本的に、いくつかのファイルをコンピューターにコピーし、ソフトウェアをロードし、計算を実行してから、データを取得します。私はこれのためにすでにパスワードなしの接続を作成しました。以下は私の試みです:

#!/bin/bash
scp ./* username@Host:/home/tmp
work=$pwd
ssh username@Host
cd /home/tmp
module purge
module load gcc/4.6.0 icc/11.1.075  ifort/11.1.075 compilers-extra mpi-openmpi/1.4.3-icc-11.1 vasp
mpirun -np 20 vasp > out.vasp 2>&1 &
scp ./* username@headnode:$work

スクリプトはファイルをコピーしてリモートコンピューターにログインするだけですが、計算は開始されません。

3
hat

あなたの質問が何であるかはよくわかりませんが、コメントするには長すぎる2つのコメントがあります。

  1. Host(4行目)にログインすると、現在のスクリプトは停止し、インタラクティブに何かを実行するのを待ちます。終了したときにのみ、スクリプトが続行されます(これはおそらくあなたが望むものではありません)。

    したがって、リモートサーバーで実行されるものはすべてスタンドアロンのシェルスクリプトに入れ、残りのデータと一緒にそこにコピーし、ssh username@Host /path/to/my/scriptで実行します。

    したがって:

#!/bin/bash
# your local script
scp ./inputs* ./do_stuff.sh username@Host:/home/tmp
ssh username@Host /home/tmp/do_stuff.sh
scp username@Host:/home/tmp/outputs* .

#!/bin/bash
# script for remote execution do_stuff.sh
cd /home/tmp
module purge
module load gcc/4.6.0 icc/11.1.075  ifort/11.1.075 compilers-extra mpi-openmpi/1.4.3-icc-11.1 vasp
mpirun -np 20 vasp > out.vasp 2>&1

inputs*/outputs*を、クラスターとの間でコピーする必要があるものに置き換えます。おそらく、入力をコピーバックしたくないでしょう。 do_stuff.shとして参照されるスクリプトは、実行可能としてマークする必要があることに注意してください。それでも機能しない場合(コピー先のファイルシステムがnoexecオプションでマウントされているため、ssh username@Host bash /home/tmp/do_stuff.shを使用します。または、リモートマシンにパイプすることもできます。

cat do_stuff.sh | ssh username@Host bash -

2)これをheadnodeで実行している場合(そう思われます)、scpheadnodeを再度実行することにより、scp接続の一方向を取り除くことができます。

2
peterph

リモート実行用にスクリプトを自宅に置いてから、スクリプトを次のように呼び出すことをお勧めします。

ssh user@Host 'bash -s' < local_script.sh

基本的に、パスワードなしでアクセスできるスクリプトから、ssh username@Host、スクリプトが実行されていません。これは簡単にテストできます。

テスト

これらの2行をスクリプトに入れて、ローカルマシンからスクリプトを実行してみてください。

ssh username@Host
hostname

通常、sshを実行したので、リモートマシン名が出力されると予想されます。しかし、そうではありません。リモートマシンにログインするだけで、リモートマシンからexitすると、ホスト名のみが出力されます(出力しているホスト名を確認してください)出力すると、ローカルマシンのホスト名)が出力されます。

さて、私が提案したように、あなたがあなたの地元の家にあなたのスクリプトを持っていて、それを次のように呼ぶなら、

ssh user@Host 'bash -s' < local_script.sh

この場合の出力は、リモートホストマシン名です(これは今は役に立たないので、スクリプトからssh行を削除してください)。

1
Ramesh

基本的に、スクリプトがリモートマシンで続行されることを期待していますが、これは発生しません。代わりに、ローカルマシンで実行されます。目的を達成するには、sshを介して一連のコマンドをリモートマシンに渡す必要があります。

このガイドを読んでアイデアを得ることができます: http://www.shellhacks.com/en/Running-Commands-on-a-Remote-Linux-Server-over-SSH

0
Isaac