リモートコンピュータからデータをコピー、実行、取得する方法は?

リモートコンピュータからデータをコピー、実行、取得する方法は?

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

#!/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

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

答え1

あなたの問題が何であるかよくわかりませんが、私の意見の2つが長すぎます。

  1. ログインするとすぐhost(ライン4)現在のスクリプトが停止し、対話的にいくつかの操作が行われるのを待ちます。ログアウトするときにのみスクリプトが続行されます(おそらく望むものではないかもしれません)。

    したがって、リモートサーバーで実行したいすべてをスタンドアロンシェルスクリプトに入れ、残りのデータと一緒にscpしてください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プログラムを再実行して1方向のscp接続を削除できます。scpheadnode

答え2

リモート実行のためにスクリプトを自宅に保管してから、スクリプトを呼び出すことをお勧めします。

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行を削除してください。)。

答え3

デフォルトでは、スクリプトはリモートシステムで続行したいが、そのようなことは起こらず、ローカルシステムで実行されます。目的を達成するには、SSHを介して一連のコマンドをリモートシステムに渡す必要があります。

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

関連情報