为什么 SSH 没有调用 .bash_profile?

为什么 SSH 没有调用 .bash_profile?

我的理解是,它.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/shbash则将以 POSIX Bourne shell 兼容模式调用,其中bash不会运行 - 特定的启动脚本。

相关内容