我有十台左右的服务器,我定期用SSH连接.每个人都在我的本地计算机~/.ssh/config
文件中有一个条目.
为了避免在我的Internet连接不可避免地丢失时失去对正在运行的进程的控制,我总是在tmux
会话中工作.我希望有一种方法可以在每次启动SSH连接时自动连接tmux,因此我不必在SSH连接tmux attach || tmux new
后始终输入.
不幸的是,这并不像我原先希望的那么简单.
~/.bashrc
在服务器上添加任何命令,因为我只希望它用于SSH会话,而不是本地会话.tmux attach || tmux new
到~/.ssh/rc
服务器上只会导致not a terminal
连接后抛出错误,即使RequestTTY force
在我的本地SSH配置文件中将该选项添加到该服务器的行中也是如此.小智 72
要在通常通过SSH(并且只有SSH)登录时自动启动远程服务器上的tmux,请相应地编辑~/.bashrc
远程服务器上的用户或root用户(或两者):
if [[ -n "$PS1" ]] && [[ -z "$TMUX" ]] && [[ -n "$SSH_CONNECTION" ]]; then
tmux attach-session -t ssh_tmux || tmux new-session -s ssh_tmux
fi
Run Code Online (Sandbox Code Playgroud)
ssh_tmux
如果不存在,则此命令将创建一个调用的tmux会话,或者重新连接到具有该名称的现有会话.如果您的连接丢失或几周前忘记了一个会话,每次SSH登录都会自动返回您留下的tmux-ssh会话.
没什么特别的,只是ssh user@hostname
.
Ale*_*yan 45
好吧,我找到了一个满意的解决方案.在我的本地~/.bashrc
,我写了一个函数:
function ssh () {/usr/bin/ssh -t $@ "tmux attach || tmux new";}
Run Code Online (Sandbox Code Playgroud)
它基本上覆盖了ssh终端函数,用给定的参数调用内置的ssh程序,然后是"tmux attach || tmux new"
.
($@
表示命令行上提供的所有参数,因此ssh -p 123 user@hostname
将扩展为ssh -t -p 123 user@hostname "tmux attach || tmux new"
)
(该-t
参数等同于RequestTTY Force
tmux命令并且是必需的.)
Six*_*ive 40
相反,使用~/.ssh/config
像这样:
进入你的本地~/.ssh/config
,put²:
Host myhost
Hostname host
User user
RequestTTY yes
RemoteCommand tmux new -A -s foobar
Run Code Online (Sandbox Code Playgroud)
RequestTTY yes
你可以ssh
用-t
switch调用;谢谢你,@kyb。tmux -u …
为显式启用 Unicode 支持,即使在没有设置正确环境变量的机器上也是如此。与上面几乎相同,但将最后一行更改为³:
RemoteCommand tmux at -t foobar || tmux new -s foobar
Run Code Online (Sandbox Code Playgroud)
¹截至 2021 年 7 月 28 日,随 tmux 3.1 或更新版本一起提供的发行版列表已经很长了(请参阅repology.org了解为什么发行版提供的版本)。在这一点上,人们可能真的应该推动旧版本或过时版本的更新。
²new
是new-session
.
³at
是 的缩写attach-session
。
仅当出于某种原因,您真的无法在客户端执行此操作时:
authorized_keys
文件如果您~/.ssh/config
出于某种原因不想拥有文件,或者希望远程机器强制连接机器连接到/打开会话,请将其添加到您的远程~/.ssh/authorized_keys
:
command="tmux at -t foobar || tmux new -s foobar" pubkey user@client
Run Code Online (Sandbox Code Playgroud)
当然,这将适用于所有安装了相应私钥的客户端,有些人可能认为这是一个好处 ––但是:如果出现任何问题,如果没有(半)物理访问机器,则可能无法再连接!
Den*_*din 16
连接:
ssh user@host -t "tmux new-session -s user || tmux attach-session -t user"
Run Code Online (Sandbox Code Playgroud)
会议期间:
使用Ctrl+d
以完成会话(TMUX窗口关闭)或Ctrl+b d
以临时分离从会议和以后再次连接到它.
记得!如果您的服务器重启会话丢失了!
当您在tmux中时,您可以使用它Ctrl+b s
来查看会话列表并将当前切换到另一个列表.
修复你的.bashrc:
我建议你在你的下面定义通用功能.bashrc
:
function tmux-connect {
TERM=xterm-256color ssh -p ${3:-22} $1@$2 -t "tmux new-session -s $1 || tmux attach-session -t $1"
}
Run Code Online (Sandbox Code Playgroud)
它22
默认使用端口.定义快速连接别名:
alias office-server='tmux-connect $USER 192.168.1.123'
alias cloud-server='tmux-connect root my.remote.vps.server.com 49281'
Run Code Online (Sandbox Code Playgroud)
无密码登录:
如果您不想每次都输入密码而不是生成.ssh
密钥以自动登录:
ssh-keygen -t rsa
eval "$(ssh-agent -s)" && ssh-add ~/.ssh/id_rsa
Run Code Online (Sandbox Code Playgroud)
将您的公钥放到远程主机:
ssh-copy-id -p <port> user@hostname
Run Code Online (Sandbox Code Playgroud)
其他提示:
如果要使用与本地bash会话相对应的临时会话ID,请使用tmux id:
SID=$USER-$BASHPID
ssh user@host -t "tmux new-session -s $SID || tmux attach-session -t $SID"
Run Code Online (Sandbox Code Playgroud)
mon*_*too 14
我使用了来自@kingmeffisto的行(我不允许评论该答案)并且我添加了一个退出,因此终止tmux也会终止ssh连接.然而,这打破了SFTP会议,所以我不得不检查$SSH_TTY
而不是$SSH_CONNECTION
.
编辑4/2018:为交互式终端添加了测试,[[ $- =~ i ]]
以允许像Ansible这样的工具工作.
if [ -z "$TMUX" ] && [ -n "$SSH_TTY" ] && [[ $- =~ i ]]; then
tmux attach-session -t ssh || tmux new-session -s ssh
exit
fi
Run Code Online (Sandbox Code Playgroud)
Fab*_*osa 11
如本博文中所述,您可以使用单个命令ssh然后附加到现有的tmux会话:
ssh hostname -t tmux attach -t 0
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
35799 次 |
最近记录: |