为什么在没有可视终端的情况下通过SSH执行命令会使用不同的PATH位置?

时间:2017-07-18 14:36:10

标签: linux unix ssh

当执行简单地启动命令而不是实际连接你的SSH会话时,看起来好像我的PATH环境变量与我正常连接到SSH会话时不同,并且它缺少bash命令的二进制文件的位置。为什么会这样,我怎么能避免呢?

正常连接:ssh root @ host 产生

的PATH环境
  

PATH = '/ sbin目录; / usr / sbin目录; / PROC /启动'

执行命令但没有连接到终端的ssh(ssh root @ host ls)的ssh会产生“ls:command not found”。在进一步检查时,PATH环境变量缺失/ proc / boot,因此缺少ls二进制文件的位置。

此“非终端”会话的PATH环境产生:

  

PATH = '/ usr / sbin目录; / sbin目录'

但不是/ proc / boot,所以它不能调用像ls,mkdir等标准动作。

这是为什么?如果只是通过SSH执行命令,但是没有直接连接到显示的终端,我怎样才能获得正确的PATH?

3 个答案:

答案 0 :(得分:0)

在运行命令

之前运行远程服务器的.profile
  ssh user@host "~/.bash_profile; $command"

答案 1 :(得分:0)

#!/bin/bash
dets () {
        sleep 1;
        echo $1
        sleep 1
}
dets "$1" | ssh -T username@ipaddress

尝试使用上面的脚本将要执行的命令传递给脚本,即./sshscr" ls"这将禁用伪tty分配(-T),然后通过函数det执行命令并传递命令。

答案 2 :(得分:0)

这实际上是一个功能。当您使用终端 ssh会话时,您将获得一个交互式登录会话。所以sshd守护进程启动你的登录shell(在/ etc / password中声明的那个)作为登录shell。读取配置文件并初始化各种环境参数,您可以开始输入命令 - 对于老恐龙来说它是rlogin模式,对于年轻人来说它只是一种登录模式

直接在ssh行上传递远程命令时,不会发生上述任何操作。 sshd守护程序只是设置一个默认环境并启动命令 - 它是恐龙的rsh模式或年轻人的命令模式。

如何解决:

最好的方法是在ssh行中直接传递命令时不依赖于PATH:

ssh root@host /bin/ls

或者,您可以将命令传递给交互式shell(假设在linux上使用bash):

echo 'ls' | ssh root@host "bash -i"

但请注意,它只是一个交互式shell,而不是登录shell:~/.bashrc将会被读取,但~/.profile也不会~/.bash_profile