通过 ssh 在远程服务器上执行命令

Posted

技术标签:

【中文标题】通过 ssh 在远程服务器上执行命令【英文标题】:Execute command on remote server via ssh 【发布时间】:2013-11-22 13:58:34 【问题描述】:

我正在尝试通过本地服务器上的 ssh 命令在远程 linux 服务器上执行命令,如下所示:

ssh myremoteserver 'type ttisql'

其中 ttisql 是我的远程机器路径上的可执行文件。

运行结果是:

bash:第 0 行:类型:ttisql:未找到

当我简单地先连接并执行以下操作时:

ssh myremoteserver

然后输入命令:

[myuser@myremoteserver~]$: 输入 ttisql

如我所料,我找回了 ttisql exe 的路径。

奇怪的是,当我在我的 beta 环境中执行第一个命令时,它按预期工作并返回 exe 的路径。在 beta 场景中,机器 A 正在连接到远程机器 B,但两台机器都在现场,并且 ssh 命令快速连接到远程机器。

当机器A在本地,机器B在异地并且ssh命令需要一两秒才能连接时,我们的生产环境会遇到问题。

我能看到的唯一区别是生产 ssh 连接所需的时间。远程系统上的路径是正确的,因为如果在初始连接后输入该命令即可。

谁能帮我理解为什么这个简单的命令可以在一个环境中工作而不是在另一个环境中工作?问题是否与通过 ssh 连接所需的时间有关?

【问题讨论】:

【参考方案1】:

非交互式会话 (ssh command) 和交互式会话 (ssh,然后是 command) 中的环境可能不同。在这两种情况下都尝试echo $PATH

ssh myremoteserver 'echo $PATH'

ssh myremoteserver
[myuser@myremoteserver~]$: echo $PATH

如果它们不同,请在所有启动脚本中查找基于 $PS1$- 的一些不同行为

【讨论】:

【参考方案2】:

您的PATH 在您的shell 是交互式的(= 当您登录服务器时)和非交互式的(使用ssh 运行命令)时设置不同。

查看您的 shell 使用的 rc 文件,例如 .bashrc.bash_profile.profile(取决于您的系统)。如果你把PATH设置在了正确的位置,那么当你通过ssh运行它时ttisql就可以工作了。

另一种解决方案是使用ttisql 的绝对路径,这样就不会依赖于您的PATH 设置。

【讨论】:

更新 .bashrc 和 .bash_profile 文件就可以了。谢谢! 感谢您的回答。对我来说,另一个问题是ssh remote echo $PATHssh remote 'echo $PATH' 之间的区别。刻度线是关键。 太酷了@fenkerbb!顺便说一句,您示例中的通用名称是单引号;-)

以上是关于通过 ssh 在远程服务器上执行命令的主要内容,如果未能解决你的问题,请参考以下文章

通过ssh远程执行命令导入定时任务报错----解决过程

ssh执行远程服务器脚本 提示php: command not found

ssh远程执行命令

如何使用java通过ssh的方式登录远程服务器执行命令并返回结果

在远程服务器上通过ssh运行sudo

Linux远程执行shell命令