特に、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
。そこに情報をパッケージ化できますが、サーバー側でアンパックされていることを確認する必要があります。クライアントは他のメッセージを送信できますが、サーバーはAcceptEnv
in useディレクティブを使用してメッセージを受け入れるように設定する必要があります/etc/sshd_config
。 Debianおよびほとんどの派生製品(Ubuntu、Mintなど)では、名前で始まるすべての変数もLC_
SSHサーバーで許可されています。これらの変数は通常ロケールの設定に使用されますが、独自の変数の1つを使用して追加の変数を渡すこともできます。サーバーが許可する場合は、簡単に作成できます。
LC_STARTUP_OPTION=A ssh
もう一つの可能性はユーザー認証キーに基づいてコマンドを実行する(これは~/.ssh/authorized_keys
sshd構成ではなく制御のみが必要です)。
環境変数を転送できない場合は、これまでやってきたようにコマンドラインで設定してからインタラクティブシェルを実行できます。新しいシェルを実行しているので(同時に対話型シェルを実行してインポートするための初期コマンドを指定できないため、必要です)、これはシェル変数ではなく環境変数でなければなりません。
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