使用 SSH 时未加载 ~/.profile(Ubuntu)

使用 SSH 时未加载 ~/.profile(Ubuntu)

编辑以反映我真正想要解决的问题:

我需要设置我的 ruby​​ 环境,以便可以通过 Capistrano 进行部署。

export PATH=$HOME/.rbenv/bin:$PATH
eval "$(rbenv init -)"

我将它们放在 ~deploy/.profile 中,但当我 ssh 登录时,它们没有运行。有什么想法吗?

我正在运行 Ubuntu 12.04。


最初的问题是:

当我通过 ssh 连接到 localhost 上的另一个帐户时,它不会加载我的 .profile。我该如何强制 ssh 加载它?我正在运行 Ubuntu 12.04。

答案1

你可以明确指定想要启动交互式登录 shell:

 ssh user@host bash --login -i 

“角色”~/.profile或 ~./bash_profile)并且.bashrc对于 ssh 有一些其他文件,(man ssh有关详细信息,请参阅):

~/.ssh/环境

包含环境变量的附加定义;请参阅上文的环境。

〜/.ssh / rc

用户登录时,在用户 shell(或命令)启动之前,ssh 将执行此文件中的命令。有关更多信息,请参阅 sshd(8) 手册页。

答案2

.profile仅为登录 shell 加载,而 ssh 会话不会加载(默认情况下)。如果您希望某些东西在启动时在所有交互式 shell 上运行,请将其放入.bashrc(或.zshrc您的 shell 使用的任何内容)。

另外,如果您只想登录本地计算机上的另一个帐户,那么 ssh 可能就有点大材小用了。您可能想改用su或其他东西。

答案3

使用 bash 应该会导致读取~/.bashrc。以下内容可能对 ksh 和 sh(sh 模式下的 bash)有帮助,或者当您的~/.bashrc在登录期间未执行时有帮助。

sshd 会查询~/.ssh/environment(检查 sshd_config(5) 的权限) 和~/.ssh/sshrc~/.ssh/rc。这样就可以设置ENV=~/.profileBASH_ENV=~/.profileSSH_LOGIN=Y

~/.profile有以下布局(使用 bash 时替换ENV为):BASH_ENV


if [[ -n $SSH_LOGIN || -z $ENV ]]; then
     # Put here login initialization code
     unset SSH_LOGIN
     ENV=~/.profile
fi
 # Put here code thats get executed with each ksh/sh invocation

答案4

Bash~/.profile仅在登录 shell 和~/.bash.bashrc具有终端时才会读取,默认情况下,在使用 ssh 调用命令时,这两者都不是真的。但是,在服务器上还有其他几个设置环境的选项,不幸的是,所有这些都取决于系统设置:

  • 即使在这种情况下, Zsh 也会读取~/.zshenv;但是 bash 没有相应的配置文件。
  • 如果PermitUserEnvironment中的选项为 on /etc/sshd_config,ssh 将读取~/.ssh/environment。不幸的是,此选项默认为 off。
  • 如果在 中pam_env.so调用,它将读取。虽然它不是模块的默认值,但它user_readenv=1/etc/pam.d/sshd~/.pam_environment至少在 Ubuntu 中是这么称呼的
  • 如果所有其他方法都失败了,您可以command=在授权密钥文件中放置一个指令,调用一个包装器脚本来设置环境并$SSH_ORIGINAL_COMMAND在最后执行(我的命令是用于 shell 的命令,因此 eval 在这里是合适的,但我不确定)。

相关内容