対話型セッションでのみRemoteCommandを使用してSSHを構成する方法(つまり、コマンドがないかsftpではありません)

対話型セッションでのみRemoteCommandを使用してSSHを構成する方法(つまり、コマンドがないかsftpではありません)

現在、私はローカルホストとリモートホストでフィッシュをメインシェルとして使用しています。

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

オプション1)

一致を選択できます(参照:男 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を使用できます。

答え2

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

答え3

1つのオプションは、コマンドのsshシンボリックリンクエイリアスを作成することです。

ln -s /usr/bin/ssh $HOME/bin/ssht

$HOME/bin人生をより簡単にするには$PATH

SSH構成では:

Match Host example.com exec "test $_ = $HOME/bin/ssht"
     RemoteCommand tmux new-session -A -s mysession
     RequestTTY yes

ssht example.comこれで、tmuxセッションと非tmuxセッションにそれぞれまたはを使用することを選択できるようになりました。ssh example.com

答え4

これは質問に直接答えません。しかし、私はこれが根本的な問題に対する解決策になったので、投稿する価値があると思いました。

私が本当に望むのは、tmuxを自動的に入力することです。代わりに、tmuxの上に構築されましたが、より便利なbyobuを使用し始めました。たとえば、このユースケースはデフォルトでサポートされています。

byobuをインストールしたら、次を実行します。

byobu-enable

これで終わりました。次の対話式セッションは、シェルに関係なく自動的に byobu に入ります。非対話型接続は通常どおりに機能します。

関連情報