本地脚本和通过 ssh 脚本的不同行为

本地脚本和通过 ssh 脚本的不同行为

我在服务器 A 上有一个脚本

脚本-A

#!/bin/bash -l
echo "script-A.sh" | change-environment.sh

当我 ssh 到服务器 A 并执行它时,它工作正常。但是,当我

ssh user@server-A ./script-A.sh

Script-A 执行,但在 change-environment.sh 中抛出未定义变量错误。

change-environment.sh 在 c shell 中运行(我无法控制脚本,因此我使用的方法是我能使用的唯一方法),但其他一切都在 bash 中。

发现类似的问题 我可以在本地运行脚本,但无法执行“ssh HOSTNAME /path/to/script.sh”但该问题至今未有解决,已持续一年。

答案1

当使用 ssh 和命令时,即使您的脚本使用了,它也可能不会真正创建登录 shell #!/bin/bash -l

尝试ssh user@server-A bash -l,然后运行脚本。您还可以创建类似

    #!/bin/bash
    export 

然后在手动登录后(ssh user@server-A)以及使用 ssh 通过命令(ssh user@server-A name-of-that-script.sh)运行它。

例如,在 Mac OS X 上,使用ssh martin@nathan bash -l甚至不会设置PS1,而普通ssh martin@nathan交互式 shell 则会设置。

另一个重要的区别是,只有在交互运行时(无需命令登录)才会分配伪终端。

答案2

您的脚本可能需要一个终端 (tty)。您只需运行 ssh 并强制使用伪终端,它就可以正常运行。

远程控制-ttremote_host“你的脚本”

答案3

您确实需要比较您的环境,.profile 可帮助您使它们保持一致。为什么不检查一下您的代码,看看它依赖于哪些环境变量?然后您可以在脚本 A 中修复这些环境变量。顺便说一句,我还建议您在调试时像这样调用 bash 脚本:

bash -v

(详细)

相关内容