現在、ローカルホストとリモートホストのメインシェルとしてFishを使用しています。
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 )
オプションMatchを使用できます( man ssh_config を参照)
Match Host example.com exec "test $_ = /usr/bin/ssh"
RemoteCommand tmux a; or tmux
RequestTTY yes
これはsshとsftpの違いのみを区別します
オプション2
Diffeコマンドのプレースホルダー設定をいくつか作成します。例:
Host tmux.example.com
HostName example.com
HostKeyAlias example.com
RemoteCommand tmux a; or tmux
RequestTTY yes
また、sftp/pingを使用するためにexample.comを引き続き使用できます。
私は引数のsshオプションとスペースを扱うより複雑なものを使用しています:
Match exec "POSIXLY_CORRECT=1 xargs -0 getopt -o 46AaCfGgKkMNnqsTtVvXxYyB:b:c:D:E:e:F:I:i:J:L:l:m:O:o:p:Q:R:S:W:w: -- </proc/$PPID/cmdline | Perl -pe 's|.*? -- ||' | { read -r c; eval a=($c); [ ${#a[@]} -le 2 ]; }"
RemoteCommand my-command-here
RequestTTY yes
また、誰かが一部のマシン( "Host xxxx"内など)でRemoteCommandを使用したい場合は、同じトリックを逆論理で使用できます(一致はホストの後に評価されます)。
Match exec "POSIXLY_CORRECT=1 xargs -0 getopt -o 46AaCfGgKkMNnqsTtVvXxYyB:b:c:D:E:e:F:I:i:J:L:l:m:O:o:p:Q:R:S:W:w: -- </proc/$PPID/cmdline | Perl -pe 's|.*? -- ||' | { read -r c; eval a=($c); [ ${#a[@]} -gt 2 ]; }"
RemoteCommand none
RequestTTY auto
Host machine1 machine2 ...
RemoteCommand my-command-here
RequestTTY yes
誰かが気になる場合は、現在RemoteCommandを使用して画面を呼び出しています。
RemoteCommand which screen &>/dev/null && TERM=xterm screen -q -RR "%u-%C" $Shell -l || $Shell -l