目前我在本地和远程主机上使用 Fish 作为我的主要 shell。
我通过 ssh 和 sftp 连接到远程主机。默认情况下,我想在连接时自动打开或重用远程 tmux;所以我将此添加到我的~/.ssh/config
:
Host example.com
RemoteCommand tmux a; or tmux
RequestTTY yes
问题是现在我无法通过 连接sftp
,也无法从本地 CLI 运行直接命令:
➤ ssh example.com ping localhost
Cannot execute command-line and remote command.
➤ sftp example.com
Cannot execute command-line and remote command.
Connection closed
所以,我的问题是:如何定义打开新的交互式 SSH 会话时要执行的默认命令,但使其可覆盖?
选项1 )
你可以选择匹配(见man ssh_config)
这只会区分 ssh 和 sftp 之间的区别
选项 2
您为您的差异命令创建一些占位符配置,例如:
并且之后您仍然可以使用 example.com 为您提供 sftp/ping 使用。
我正在使用更复杂的东西来处理 ssh 选项和参数中的空间:
此外,如果有人想在某些机器上使用 RemoteCommand(比如在“主机 xxxx”内部),可以在反向逻辑中使用相同的技巧(匹配在主机之后评估):
如果有人好奇,我目前正在使用 RemoteCommand 调用屏幕:
一种选择是为
ssh
命令创建一个符号链接别名:为了让生活更轻松,请确保
$HOME/bin
在您的$PATH
.在您的 ssh 配置中:
现在,您可以分别选择使用tmux
ssht example.com
和ssh example.com
非 tmux 会话。这是一个对我有用的解决方案。
它适用于 bash 和 fish
正如@Yajo 所说,fish 不支持 $_
我之所以使用
tmux new -A
,是因为我的远程服务器支持 tmux 3.1 和会话存在时的自动附加。我不得不使用
%%self
来逃避 % 并能够使用 %self。下面是它的工作原理
您要求使用 选择当前进程
--pid %self
,但您要求使用 显示您的父 pid-o ppid
,然后您要求仅获取该值,并使用丢弃标题--no-headers
所以现在你有了应该是 ssh/scp/sftp 命令的 pid。
现在您需要知道,运行它的命令是什么。
| xargs -r ps ww --pid
将推出ps ww --pid YOUR_PARENT_PID
如果上一个命令不匹配,则
-r
避免xargs
启动的状态。ps
我正在使用
xargs
and not$()
,因为 fish 不支持$()
,但是()
这种差异会导致我的代码在其中一个bash
或fish
两个中都可以工作,所以我正在使用xargs
然后我们有
ps ww --pid YOUR_PARENT_PID
:ww
将转储完整的命令行,所以在这里你可以像我一样使用 fgrep 或像@cryptarch 那样使用 wc。这并不能直接回答问题。然而,它已成为我解决根本问题的方法,所以我认为它值得一贴。
我真正想要的是自动输入 tmux。相反,我刚开始使用 byobu,它建立在 tmux 之上,但更舒适。例如,它开箱即用地支持这个用例。
安装 byobu 后,运行:
你完成了。下一个交互式会话将自动进入 byobu,无论外壳如何。非交互式连接将照常工作。