SSHの特定のシェルに変数定義を渡す

SSHの特定のシェルに変数定義を渡す

特に、zshで事前定義された設定を持つコンピュータにSSHを介して接続したいと思います。

この目的のために、クライアントは次のことを試みました。この回答):

$ ssh -t machine@domain "STARTUP_OPTION='A'; exec /path/to/zsh;"

その後、.zshrcサーバーには次のものがあります。

if [ "$STARTUP_OPTION" = "A" ]; then
    echo "Logging in with A"
fi

これはうまくいかないようです。リモートシェルからシェル変数の値を渡すときに特定のシェルにログインする方法は?

答え1

デフォルトでは、SSH接続を介して送信される唯一の環境変数はですTERM。そこに情報をパッケージ化できますが、サーバー側でアンパックされていることを確認する必要があります。クライアントは他のメッセージを送信できますが、サーバーはAcceptEnvin useディレクティブを使用してメッセージを受け入れるように設定する必要があります/etc/sshd_config。 Debianおよびほとんどの派生製品(Ubuntu、Mintなど)では、名前で始まるすべての変数もLC_SSHサーバーで許可されています。これらの変数は通常ロケールの設定に使用されますが、独自の変数の1つを使用して追加の変数を渡すこともできます。サーバーが許可する場合は、簡単に作成できます。

LC_STARTUP_OPTION=A ssh

もう一つの可能​​性はユーザー認証キーに基づいてコマンドを実行する(これは~/.ssh/authorized_keyssshd構成ではなく制御のみが必要です)。

環境変数を転送できない場合は、これまでやってきたようにコマンドラインで設定してからインタラクティブシェルを実行できます。新しいシェルを実行しているので(同時に対話型シェルを実行してインポートするための初期コマンドを指定できないため、必要です)、これはシェル変数ではなく環境変数でなければなりません。

ssh -t machine@domain 'export STARTUP_OPTION="A"; exec /path/to/zsh'

別のアプローチは、標準入力を介して一部のデータをシェルに供給し、標準入力を端末にリダイレクトすることです。

ssh -t localhost 'echo "echo foo; exec </dev/tty" | exec zsh -i'
stdin: is not a tty
stty: standard input: Inappropriate ioctl for device
~% 

端末を初期化できないというエラーメッセージにもかかわらず、zshはセッションの対話型部分を正しく処理しているようです。

答え2

exportプロセスが変数定義を継承するように変数を定義できますzsh

$ export foo=bar
$ exec zsh
$ echo $foo
bar

または以下を使用してくださいenv

$ exec env foo=bar zsh
$ echo $foo           
bar

関連情報