如何在建立mosh连接时运行复杂的命令?

时间:2014-04-10 00:35:05

标签: shell ssh tmux mosh

使用ssh我可以这样做:

ssh REMOTE -t 'tmux a || tmux'

我可以做的最好的事情是:

mosh REMOTE -- tmux a

但这不起作用:

mosh REMOTE -- tmux a || tmux

这两者都没有:(无论是单引号还是双引号都没关系,我都试过了)

mosh REMOTE -- 'tmux a || tmux'

所以,我的问题是:我该怎么做这个工作?

3 个答案:

答案 0 :(得分:13)

好吧,似乎我必须明确地使用shell来执行命令:

mosh REMOTE -- sh -c 'tmux a || tmux'

修改

而不是tmux a || tmux,更好的方法是将new-session添加到~/.tmux.conf,然后运行tmux。这会让事情变得更容易。我现在可以这样做了:

mosh REMOTE -- tmux

真棒!

答案 1 :(得分:3)

可能会有比上面给出的示例更复杂的命令。我想创建一个命令,重新连接到现有的tmux会话(如果存在但尚未连接),或者如果没有可用则重新连接。

this example,我会做这样的事情:

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直接执行此操作,那将是很好的但我似乎无法解决这个问题。

答案 2 :(得分:0)

把它放在你的 vendor

的末尾
.bashrc

如果由 s1="`ps $PPID|grep mosh|awk '{print $5}'`" s2=mosh-server if [[ "$s1" == "$s2" ]]; then source .moshrc; fi 调用,mosh-server 将执行它在 bash 中找到的任何内容 - 因此只需将您的命令放在您的主目录中名为 $HOME/.moshrc 的文件中。

因为 mosh 调用登录 shell,所以你应该有一行

.moshrc

在您的 source .bashrc 中,或将以上几行放在 .bash_profile 中。