编辑以反映我真正想要解决的问题:
我需要设置我的 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=~/.profile
或BASH_ENV=~/.profile
和SSH_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 在这里是合适的,但我不确定)。