在 ssh shell 中手动运行命令与运行“ssh user@host”有什么区别?

在 ssh shell 中手动运行命令与运行“ssh user@host”有什么区别?

我以为它们是一样的,但事实并非如此。

在我的特定情况下,构建脚本在构建服务器上的 ssh 会话中以 ./build.sh 的形式执行时工作正常,如下所示

$ssh user@host
$./build.sh

但当作为 ssh 参数运行时会失败,如下所示:

$ssh user@host /home/user/build.sh

或者像这样

$ssh user@host ./build.sh

脚本本身只是调用一堆二进制文件,它们的错误消息对于调试没有太大帮助。

但只要环境相同,脚本中的内容就无关紧要了,对吧?那么可能有什么不同呢?

编辑:不知道这是否重要,但所描述的行为发生在没有桌面环境的 ArchLinux Virtualbox 客户机上。我也在具有桌面环境的 Ubuntu18.04 VM 上尝试了同样的操作,并且脚本在两种情况下都正常工作。

答案1

我想我已经明白了。

两种情况的区别在于交互式 shell 与非交互式 shell,它们确实是截然不同的环境。

您不需要以 的方式运行脚本$ssh user@host ./build.sh,而是先通过调用 打开一个登录 shell bash -l,如下所示:

$ssh user@host bash -l ./build.sh

我不知道它是否使执行环境与通过 ssh 手动运行脚本完全相同,但它修复了我遇到的错误。

答案2

如果您没有指定要运行的程序,那么 ssh 将启动一个交互式 shell,并为其分配一个伪终端。

如果您指定要运行的命令,则不会进行伪终端分配,这将导致某些命令失败(最明显的是使用 TERM 变量的命令,例如 curses 前端)。

您可以使用开关强制终端分配-t,检查是否可以解决您的问题。

答案3

逻辑是这样的:

ssh 远程主机 假定您本地计算机上的用户名与远程计算机上的用户名相同,而如果您远程计算机上的用户名不同,则需要按照以下格式解析远程用户的名称:ssh 用户名@远程主机

ssh user@IP ./exe.sh如果脚本本身、权限和路径都很好,那么没有理由不工作。

相关内容