web-dev-qa-db-ja.com

対話型セッションに対してのみRemoteCommandを使用してSSHを構成する方法(つまり、コマンドなし、またはsftpなし)

現在、ローカルホストとリモートホストのメインシェルとして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セッションを開くときに実行されるデフォルトのコマンドを定義して、それを上書きできるようにするにはどうすればよいですか?

6
Yajo

オプション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を引き続き使用できます。

7
EchoMike444

私は引数の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