con*_*nrs 24 ssh tmux environment-variables
我开始问这个问题,但在我打开它时回答了它。我将发布这个问题,跟进我的解决方案,并将其留给其他潜在的解决方案。
<
背景故事>
我是 tmux 和 vim 用户。我喜欢远程 vim 工作,因为我不必担心 Ubuntu 开发机器在 Flash 电影给我内核恐慌时卡住。运行 tmux 意味着在我重新启动后打开的文件正在等待我,我可以从我离开的地方继续。当我像这样连接时,在 tmux 会话中运行 vim 时遇到了问题:
ssh example.com -t 'tmux attach'
Run Code Online (Sandbox Code Playgroud)
UTF-8 问题突然出现,在正常脱壳时不会出现,只是手动附加到 tmux 会话。
<
/背景故事>
所以我想要一种在 ssh 登录时启动一些东西的可重用方法,这不会影响我在我的.zshrc
(或者你的,.bashrc
如果你仍然使用 bash)中配置的任何其他东西,这些东西可能是我的开发环境所需要的,这不会当我偶尔在这台机器上本地工作时出现。
Gil*_*il' 14
当您运行时ssh example.com
,ssh 守护进程会为您启动一个登录 shell,并且登录 shell 会读取您的~/.profile
(或~/.bash_profile
或~/.zprofile
或~/.login
取决于您的登录 shell)。当您指定要远程运行的命令(使用或不使用-t
)时,ssh 守护程序会启动一个普通的 shell,因此.profile
不会读取您的命令。补救:
ssh example.com -t '. /etc/profile; . ~/.profile; tmux attach'
Run Code Online (Sandbox Code Playgroud)
大多数 ssh 守护进程被配置为拒绝传输环境变量,除了LC_*
. 如果 ssh 守护进程example.com
允许它,你可以滥用自定义LC_*
变量来自动启动 tmux——把它放在你的~/.profile
:
if [ -n "$LC_tmux_session" ] && tmux has -t "$LC_tmux_session"; then
exec tmux attach -t "$LC_tmux_session"
elif [ -n "${LC_tmux_session+1}" ] && tmux has; then
exec tmux attach
fi
Run Code Online (Sandbox Code Playgroud)
然后使用LC_tmux_session= ssh example.com
或登录LC_tmux_session=session_name ssh example.com
。
这个答案有更多关于通过 ssh 传递环境变量的信息。
我之前建议PermitUserEnvironment yes
在您的环境中设置和添加一个环境变量,~/.ssh/environment
直到Eli Heady在下面的评论中提出更好的建议。
打开你的.zlogin
(bash: .bash_profile
etc.) 并输入以下内容:
if [[ "$SSH_CONNECTION" != "" && "$MY_SSH_CONNECTION" != "yes" ]]; then
while true; do
echo -n "Do you want to attach to a tmux session? [y/n]"
read yn
case $yn in
[Yy]* ) MY_SSH_CONNECTION="yes" tmux attach; break;;
[Nn]* ) break;;
* ) echo "Please answer y/n";;
esac
done
fi
Run Code Online (Sandbox Code Playgroud)
请注意,我已经使用了该.zlogin
文件,但您可以使用您的.zshrc
文件,但我喜欢保持我的点文件整洁并将其分开,以便我可以在其他机器上使用它。
用适合自己的问题替换问题,并替换MY_SSH_CONNECTION="yes" tmux attach
为您当时希望运行的任何内容。
请注意脚本MY_SSH_CONNECTION="yes"
在tmux attach
将其传递给 tmux之前是如何设置的,因为它还将打开一个 shell,该 shell 将访问与上面完全相同的脚本并防止任何递归。