通过 ssh 编写 shell 脚本远程命令

通过 ssh 编写 shell 脚本远程命令

我正在尝试创建一个 shell 脚本来执行一些我经常需要的命令。我使用公钥/私钥对进行 ssh 登录以跳过密码提示。经过一番搜索后,我能够执行一些代码,例如:

文件:ssh.sh

ssh -X [email protected] << EOF
cd /root/myDir
gedit a.c b.c
EOF

但如果我这样写,我看不出有什么区别:

ssh -X [email protected] << EOF
cd /root/myDir
gedit a.c b.c &
EOF

没有&什么区别。有了&,一般执行完gedit后,就会发送到后台,出现提示。但我在 gedit 后没有收到提示。 (尽管下一行中的任何内容都会被执行。就像我输入 一样echo "Hello",它会显示Hello。)

这是怎么回事?还有其他方法吗?我想做一个 SSH 并通过 shell 脚本执行一些命令。但我不想在 shell 脚本执行完成后注销。我想在执行一些我自己的命令后手动注销,这些命令不像上面的脚本那样重复。

答案1

如果没有&,您远程执行的脚本会显示“更改为/root/myDir,然后执行gedit并等待它退出”。的变体&表示不等待gedit退出。无论哪种方式,shell 在执行脚本中的最后一个命令后都会退出。

如果要执行脚本,然后执行更多交互式键入的命令,则需要在最后执行交互式 shell。

ssh -Xt [email protected] 'cd /root/myDir && gedit a.c b.c; exec bash'

该选项-t告诉 SSH 在服务器上设置一个虚拟终端;默认情况下,当您传递要执行的远程命令时,它不会执行此操作。exec bash最后告诉 shell 将自身替换为一个新的 bash 实例,这将是一个交互式 shell(显示提示、监听命令等),因为它的输入来自终端。

答案2

您可以定义 afunction然后通过 执行它ssh

#!/bin/bash
ssh_func(){

    cd /root/myDir
    gedit a.c b.c
}

ssh -X [email protected] "$(typeset -f); ssh_func"

typeset -f将显示脚本中定义的函数。

相关内容