我以为它们是一样的,但事实并非如此。
在我的特定情况下,构建脚本在构建服务器上的 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
如果脚本本身、权限和路径都很好,那么没有理由不工作。