有没有可能创建一个BASH脚本,用它可以ssh到远程机器并在那里继续执行操作?

3

我曾试图自己完成这项任务,但是在脚本登录到远程机器后,脚本就停止了。这很容易理解,因为远程机器不知道这个脚本的存在。但是,是否有办法解决这个问题呢?

谢谢。

6个回答

5
尝试使用here-doc。
ssh user@remote << 'END_OF_COMMANDS'
echo all this will be executed remotely
user=$(whoami)
echo I am $user
pwd
END_OF_COMMANDS

当你说“继续在那里做事”时,你可能是指简单地与远程会话进行交互,那么:

expect -c 'spawn ssh user@host; interact'

2
有多种方法:
  1. ssh user@remote < script.txt
  2. 将脚本复制到远程主机:scp script user@remote:/tmp/somescript.sh ; ssh user@remote /tmp/somescript.sh
  3. 编写一个expect脚本
对于前两个选项,为了自动化,请使用公钥/私钥对进行登录。

1

在这种情况下,我更喜欢使用Perl:

use Net::SSH::Perl;
my $ssh = Net::SSH::Perl->new($host);
$ssh->login($user, $pass);
my($stdout, $stderr, $exit) = $ssh->cmd($cmd);

使用它可以减少错误,更好地控制捕获命令的stdout、stderr和退出状态。


1

您需要在ssh调用的末尾提供远程命令:

$ ssh user@remote somecommand

如果您需要执行一系列命令,那么编写脚本并将其复制到远程机器(例如使用scp)并按照上述方法调用会更容易。


0

我通过使用declare -f将整个函数通过ssh传递到远程服务器并在那里执行来解决了这个问题。这实际上可以非常简单地完成。唯一的注意事项是,您必须确保函数使用的任何变量都在其中定义或作为参数传递。如果您的函数使用任何环境变量、别名、其他函数或任何其他在其外部定义的变量,则它将无法在远程机器上运行,因为这些定义在那里不存在。

所以,这就是我做的方式:

somefunction() {
    host=$1
    user=$2
    echo "I'm running a function remotely on $(hostname) that was sent from $host by $user"
}

ssh $someserver "$(declare -f somefunction);somefunction $(hostname) $(whoami)"

请注意,如果您的函数使用任何类型的“全局”变量,则可以在声明函数后通过使用sed或我更喜欢的perl进行模式替换来进行替换。
declare -f somefunction | perl -pe "s/(\\$)global_var/$global_var/g"

这将用变量的值替换函数中对global_var的任何引用。

干杯!


0

在你的~/.profile(或者例如~/.bash_profile)中加入类似以下内容即可:

function remote {
    ssh -t -t -t user@remote_server "$*'"
}

然后调用

remote somecommandofyours

1
"$*'" ... 缺少单引号?祝大家好运。 - shellter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接