SSH経由でPS1プロンプトを設定する正しい方法

SSH経由でPS1プロンプトを設定する正しい方法

リモートコンピュータでPS1プロンプトを動的に設定しようとしています。リモートシステムにSSHで接続するとき、そのリモートシステムのプロンプトに設定される値も送信するというアイデアです。リモートシステムへのSSHログインを自動化するExpectスクリプトはすでにあります。これで、自動ssh操作を実行し、sshを介して渡された値にPS1プロンプトを設定するようにスクリプトを変更しようとしています。以下は私のスクリプトです

#!/usr/bin/expect -f
set password Mayy@029Mayy@029
# now connect using ssh
spawn ssh -t [email protected]  "'export PS1='bvdev@429[\w]#'; exec bash -l"
expect "*?assword:*"
send -- "$password\r"
send -- "\r"
interact

上記のスクリプトの実行中にエラーが発生しました。Inavalid command name w while executing \w

私が正しい方法でアプローチしているかどうかはわかりません。私のスクリプトはこれに適していますか?助けてください

答え1

ExpectはTclの拡張であるため、Tclの構文規則を理解する必要があります。

spawn ssh -t [email protected]  "'export PS1='bvdev@429[\w]#'; exec bash -l"

二重引用符内で、Tclはコマンド置換メカニズムとして角括弧を使用します。また、バックスラッシュの役割は\w特殊文字(例:\tis)ではありません。

Tclの補間されていない引用メカニズム(たとえば、シェルの一重引用符)、つまり中括弧を使用する必要があります。

spawn ssh -t [email protected]  {export PS1='bvdev@429[\w]#'; exec bash -l}

しかし、bash -lユーザーのポイントファイルを処理するため、設定したPS1エクスポートが無視される可能性が高いです。

spawn ssh -t [email protected]  {
    export PS1='bvdev@429[\w]#'
    exec bash --noprofile --norc -i
}

しかし(もう一度)私はそうしません。ログイン後、必要なPS1をお送りします

spawn ssh -t [email protected] 
expect "*?assword:*"
send -- "$password\r"
send -- "\r"
send -- {PS1='bvdev@429[\w]#'}
send -- "\r"
interact

関連情報