如何从远程计算机复制、执行和检索数据?

如何从远程计算机复制、执行和检索数据?

我正在尝试在远程计算机上运行一些计算。基本上我想将一些文件复制到计算机,加载软件,执行计算,然后检索数据。我已经为此创建了无密码连接。以下是我的尝试:

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

我不太确定你的问题是什么,但我有两条评论太长了:

  1. 一旦您登录host(第 4 行),您当前的脚本就会停止,并等待您以交互方式执行某些操作 - 只有当您退出时,脚本才会继续执行(这可能不是您想要的)。

    因此,将要在远程服务器上执行的任何内容放入独立的 shell 脚本中,将其与其余数据一起 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*为您需要复制到集群或从集群复制的内容 - 您可能不想复制回输入。请注意,引用 as 的脚本do_stuff.sh必须标记为可执行。如果即使这样也不起作用(因为您要复制到的文件系统是使用该noexec选项安装的,请使用ssh username@host bash /home/tmp/do_stuff.sh。或者您可以将其通过管道传输到远程计算机:

cat do_stuff.sh | ssh username@host bash -

2) 如果您正在运行此程序(看起来确实如此),您可以通过再次运行此程序headnode来摆脱 scp 连接的一个方向。scpheadnode

答案2

我建议您将脚本放在家里用于远程执行,然后将您的脚本称为,

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

基本上,从具有无密码访问权限的脚本中,之后ssh username@host,该脚本不会被执行。这很容易测试。

测试

将这两行放入脚本中,然后尝试从本地计算机运行该脚本。

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

相关内容