我的理解是,它.bash_profile
总是通过 SSH 登录来调用。
但是,除非我执行以下操作,否则我不会看到启用的各种设置:
ssh $host "source ~/.bash_profile ; echo $PATH "
.:/mnt/spark-1.4.1/bin:/mnt/spark-1.4.1/sbin:/mnt/scala-2.11.2/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
当我简单地这样做时:
ssh $host "echo $PATH "
PATH 信息只是默认的
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
用户是root,默认shell是bash。
$ ll /bin/sh
lrwxrwxrwx 1 root root 4 Aug 6 19:54 /bin/sh -> bash
更新root 的 shell是狂欢
grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
答案1
使用 SSH 命令将不是启动登录 shell。因此 bash_profile 没有被获取。
查看具体信息这里
答案2
您是否.bashrc
设置了文件?它可能已损坏或损坏,或者存在导致处理.bashrc
阻塞和失败的问题。结果,无法达到可以干净地消化/处理的程度.bash_profile
。
如图所示在这个网站上,.bashrc
加载之前.bash_profile
:
交互式登录 | 交互式非登录 | 脚本 | |
---|---|---|---|
/etc/profile |
A | ||
/etc/bash.bashrc |
A | ||
~/.bashrc |
乙 | ||
~/.bash_profile |
B1 | ||
~/.bash_login |
B2 | ||
~/.profile |
B3 | ||
BASH_ENV |
A | ||
~/.bash_logout |
C |
我建议检查一下.bashrc
,甚至可以暂时重命名它,比如.bashrc_off
禁用它,以便在进一步调试之前测试理论。
答案3
添加-l
可能是一个简单的解决方法,-l
选项使 bash 充当登录 shell,登录 shell 将执行 .bash_profile。
ssh $host bash -l -c single_word_command
或者
ssh $host bash -l -c '"commands with space"'
因为$
符号需要转义,所以要回显 $PATH 还需要一些额外的工作,例如
ssh $host bash -l -c "'echo \$PATH'"
\
在$
阻止“本地”shell 将 $PATH 替换为真实值之前,需要使用'
in,因为在发送到“远程”后,外部会被删除"
"
顺便说一下
ssh -v
,这bash -v
对于调试这类逃避问题非常有帮助
答案4
最后一点是关于什么的/bin/sh
?如果 root 的默认 shell 设置为/bin/sh
,bash
则将以 POSIX Bourne shell 兼容模式调用,其中bash
不会运行 - 特定的启动脚本。