使用 ssh 我可以做到这一点:
ssh REMOTE -t 'tmux a || tmux'
使用 mosh 我能做的最好的事情是:
mosh REMOTE -- tmux a
但这不起作用:
mosh REMOTE -- tmux a || tmux
这个也不行:(不管是单引号还是双引号,我都试过了)
mosh REMOTE -- 'tmux a || tmux'
所以,我的问题是:我应该如何做这份工作?
好吧,看来我必须明确使用shell来执行命令:
mosh REMOTE -- sh -c 'tmux a || tmux'
编辑
而不是这样做tmux a || tmux
,更好的方法是添加new-session
并~/.tmux.conf
运行tmux
。那会让事情变得容易得多。我现在可以做这样的事情:
mosh REMOTE -- tmux
惊人的!
可能有比上面给出的示例更复杂的命令。我想创建一个命令,如果一个现有的 tmux 会话存在但尚未附加,或者如果没有可用的,则重新附加到现有的 tmux 会话。
看看这个例子,我会做这样的事情:
function tmosh() {
mosh $1 -- (tmux ls | grep -vq attached && tmux at -t $( tmux ls | grep -vm1 attached | cut -d: -f1 ) ) || tmux new
}
但这不起作用,根据上面的原始问题。
到目前为止,我的解决方案是在主机服务器上有一个包装脚本:
tmux-reattach-if-exists
它简单地包括:
(tmux ls | grep -vq attached && tmux at -t $( tmux ls | grep -vm1 attached | cut -d: -f1 )) || tmux new
然后我使用从 mosh 调用客户端上的脚本,如下所示:
function tmosh() {
mosh $1 -- tmux-reattach-if-exists
}
如果有一个解决方案可以直接通过 .tmux.conf 做到这一点,那就太好了,但我似乎无法解决这个问题。
把它放在你的最后.bashrc
s1="`ps $PPID|grep mosh|awk '{print $5}'`"
s2=mosh-server
if [[ "$s1" == "$s2" ]]; then source .moshrc; fi
如果由 调用mosh-server
,bash
将执行它在其中找到的任何内容- 所以只需将您的命令放在您的主目录中$HOME/.moshrc
命名的文件中。.moshrc
因为 mosh 调用了一个登录 shell,所以你应该有一行
source .bashrc
在你的.bash_profile
,或者把上面的行放在.bash_profile
.