bashからzshにSSHリモートコマンドを渡す

bashからzshにSSHリモートコマンドを渡す

WindowsからRed Hat Enterprise LinuxサーバーへのリモートPuttyセッションを実行しています。

会社の制限により、Linuxユーザーのデフォルトシェルをbashからzshに変更することはできません。代わりに読み取り専用アクセス権があります。~./bash_profileこのアクセス権は実行され~/.bashrc(読み取り専用アクセス権もあり)、~/.bash_custom書き込みアクセス権がある場所で実行されます。内部で~/.bash_customzshを実行してシェルを変更します。

zshを実行する行を含めると、puttyが提供するリモートコマンドは実行されません。 zshの実行をコメントアウトすると正常に動作するため、これが問題であることがわかります。

私のzshには、puttyで実行されるリモートコマンドの一部として使用したいいくつかのエイリアスとPATH修正があります。実行のためにbashシェルからzshにリモートコマンドを渡すには?

答え1

一部の(最も現在の)システムでは、sshを介して実行するときに非対話モードで実行している場合でも(たとえば、where running 1ドキュメントを実行している場合など)、読み取ることができる(およびそのシステム全体で)bashビルド時に設定します。 。bash~/.bashrc/etcssh some commandsshdbash -c 'some command'

あなたができることはあなたの上部に以下を追加することです~/.bash_custom

export SHELL="$(command -v zsh)" # tell everyone your preferred shell
case ${SSH_CONNECTION+s}:${-//[^ilc]}:$#:$SHLVL in
  (s:c:0:1) exec zsh -c -- "$BASH_EXECUTION_STRING";;
  (*:i:0:*) exec zsh;;
esac

bashがbyで実行されている場合はzsh同じコードを使用して実行され、bashが対話的に実行されると別々に実行されます。bash -c 'some code'sshdzsh

2番目のケースは、bashがログインシェルとして呼び出される場合にのみ制限できます。

if shopt -q login_shell; then
  exec zsh
fi

および/または次にssh置き換えて*:i:0:*s:i:0:*


厳密に言えbash -c -- 'some command'ば、実行する必要がありますが、一部のシェルはそれをサポートしていないため(またはcsh、fish、rc ...などの必要はないため)サポートしません。

関連情報