Match exec ...
.ssh / configでいくつかのルールを使用しています。 (具体的には、私のIPアドレスに基づいてProxyJumpを変更します。)マニュアルページで説明します。
exec キーワードは、ユーザーシェルで指定されたコマンドを実行します。コマンドが終了状態 0 を返した場合、条件は true と見なされます。空白文字を含むコマンドは引用符で囲む必要があります。
私は構文がかなり異なる2つのシェル(zshとxonsh)を使用しているので、両方のシェルで同じように機能するexecステートメントを作成するのは難しいです。ユーザーのシェルを使用する代わりに、sshにexecコマンドを特定のシェルに渡すように強制する方法はありますか?
これはローカルシェルを使用して実行され、リモートサーバーで実行されるシェルとは関係ありません。
2021年9月9日に修正:
詳細は次のとおりです。私のSSH設定には次のものがあります。
match !exec "ifconfig | egrep -q 'inet (123\.45\.|67\.89\.)'"
ProxyJump hop
これは bash 構文です。一重引用符は生の文字列を強制的に解釈するため、スラッシュはegrepに渡されます。
xonshでは、この構文はPython文字列の引用規則のために違法です。無効な参照を使用する必要がありますr'123\.'
。文字列参照はまだ$ SHELLの現在の値に応じて変更される可能性がある外部シェルによって実行されるため、execコマンド内で別のシェルを呼び出すことでこの問題を解決することはできません。
答え1
SSH設定ファイル内で特定のシェルを強制的に実行する方法が見つかりません。私は唯一の選択は、シェルを選択し、SSHを起動する方法が$SHELL
正しく設定されていることを確認することだと思います。
これはいくつかの方法で達成できます。この例では、私のssh_configがbash構文を使用してxonshでそれを呼び出そうとしますが、互換性のないシェルのすべての組み合わせは同じようにうまく機能するはずです。
ラッパースクリプト
1つの方法は、最初にラッパースクリプトを追加してPATH
SHELLを正しく設定することです。
~/空/ssh:
#!/bin/bash
# Set the shell to use within .ssh/config
SHELL=/bin/bash exec /usr/bin/ssh "$@"
次に実行可能にします(chmod +x ~/bin/ssh
)。
~/.xonshrc または呼び出しシェル構成ファイル:
# Prepend to PATH
$PATH = p`~/bin` + $PATH
.ssh/config
これは、使用されるすべてのツール(sshuttle、sshfsなど)に必要です。
Xonsh エイリアス
私のxonsh固有のソリューションでは、エイリアス機能を使用しました。
~/.xonshrc:
def bash_shell(cmd):
import functools
def alias(cmd, args):
with __xonsh__.env.swap(SHELL="/bin/bash"):
![@(cmd) @(args)]
return functools.partial(alias, cmd)
aliases |= {
'ssh': bash_shell('ssh'),
'sshuttle': bash_shell('sshuttle'),
# ...
}