現在、私はローカルホストとリモートホストでフィッシュをメインシェルとして使用しています。
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 に入ります。非対話型接続は通常どおりに機能します。