我正在尝试使用 ssh 在屏幕会话中的远程计算机上执行脚本。我使用的命令是:
ssh -t MYSERVER "cd tempdirXYZ; screen Myscript.sh"
当我执行此操作时,我会看到一个屏幕窗口显示几秒钟
cannot exec 'Myscript.sh': No such file or directory
我在远程计算机上使用 bash,并将脚本放置在我的 ~/bin 文件夹中。似乎当我运行上述命令时,我的 bash 文件没有被获取。我什至不确定 bash 是否运行过。
有什么办法可以在不改变命令的情况下完成这项工作吗?远程计算机正在运行 Ubuntu。
答案1
我刚刚意识到你说的是 ~/bin 而不是 /bin。
您需要执行以下命令将目录添加到系统的 PATH 变量中:
export PATH=\$PATH:/home/<username>/bin
这应该允许您运行上面的脚本。如果不是,它可能没有标记为可执行文件,因此运行:
chmod +x ~/bin/Myscript.sh
答案2
如果您无法更改命令,那么您无能为力。该~/.bashrc
文件应该在此命令执行期间得到处理。
可能发生的情况是你有一个有条件退出语句在 .bashrc 中,通常就在开头附近,如果检测到当前 shell 是非交互式的(在本例中是非交互式的),它将退出。有时脚本会检查主提示变量 PS1 是否已设置;这是评估交互式 shell 与非交互式 shell 的常见但丑陋的方法。在这种情况下,如果未设置 PS1,则不会解析 .bashrc 的其余部分。
我会检查是否是这种情况 - 使用一些简单的调试技术来查看 .bashrc 是否来源以及它是否提前结束(例如 echo 语句)。您需要修改远程计算机上的 .bashrc 来解决这个问题,这可能会破坏 scp 和 sftp 等其他功能。或者您可以在远程命令中设置 PS1。
如果您可以修改远程命令,则有多种解决方法:
- 将运行脚本所需的项目添加到单独的 bash 文件中。直接在您的命令中获取它。
- 在命令和远程脚本中使用完整路径。我不知道除了 PATH 之外还有哪些其他环境依赖项,但显然这些依赖项也必须得到解决。
- 在远程计算机上填充
~/.ssh/environment
所有必要的环境变量、别名、函数等。修改 ssh 配置文件/etc/ssh/shhd
以确保PermitUserEnvironment
启用该设置;否则这行不通。 - 将环境变量设置添加到命令中,例如
"export PATH=\$PATH:/home/you/bin;..."
转义PATH
可确保其是我们要添加的远程版本,从而防止在发送命令之前进行扩展。
如果这些都不起作用,请更详细地描述您的限制。
答案3
查看它被识别为什么文件类型
file myscript.sh
设置用户+执行权限
chmod u+x Myscript.sh