当执行简单地启动命令而不是实际连接你的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?
答案 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