web-dev-qa-db-ja.com

デフォルトのシェルとしてZSHを使用してシステムにSSH接続すると、/ etc / profileが実行されません

一部のマシンatmで奇妙な動作が発生しています。少なくとも、それは私と私の同僚には奇妙に思え、私たちはそれについての説明を見つけることができませんでした:)

[編集1]
次の段落は間違っているようです。最後の編集2を参照してください。
ここではbashとzshを使用しています。そのため、zshをデフォルトのシェルとして使用するように構成されている一部のzsh-default-machines(プレーンssh login@Host)にSSHで(chsh -s /usr/bin/zshを使用して)実行すると、その後開かれたシェルはインタラクティブですがnon-loginシェル。それぞれのマシンにすでにログインしているかどうかは関係ありません。

私の理解では、マシンへのSSHは、そのマシンで新しいユーザーセッションを開始する必要があるため、シェルはログインシェルである必要がありますよね。それはzshの場合もそうではありませんか?

マシンでデフォルトのシェルをbashに変更する場合、マシンへのログインにはログインシェルが使用されます。

これはzshの正常な動作ですか?変更できますか?それともいくつかの設定ミスですか?
[/編集1]

[編集2] OK、ZSHのドキュメントによると、ログインシェルかどうかを簡単にテストできます。

$ if [[ -o login ]]; then; print yes; else; print no; fi

参照: http://zsh.sourceforge.net/Guide/zshguide02.html

ただし、zsh manエントリ/ドキュメントにより、zshは/etc/profileをソースにする必要があり、/etc/profile.d/*.shの下のスクリプトをソースします。上記の私の質問は、スクリプトがではなくソースであるため、環境変数とシステム構成のほとんどが適切に初期化されないという事実に起因しました。ただし、前述のように、デフォルトのシェルとしてbashを使用している場合、/etc/profileおよびprofile.d-folder内のスクリプトが提供されます。
[/編集2]

[編集3-回答]以下のコメントの回答について、@StéphaneChazelasを送信してください。 zsh/sh互換モードで実行している場合、ksh/etc/profileのみをソーシングしているようです(respecitve manエントリ https:// linux。 die.net/man/1/zsh )。 SSH経由でのログインはその互換モードをトリガーしないため、zshは必ずしも/etc/profileを独自にソースするわけではありませんが、.zprofileを介してトリガーする必要があります[/ edit 3]

システム:OS:Ubuntu 18.04 zsh-5.4.2、omzおよび一部のプラグインがアクティブ化。

ありがとうございました!

5
nightsparc

ZSHはこのように機能します。 /etc/profileはZSHの初期化ファイルではありません。 ZSHは/etc/zprofileおよび~/.zprofile

ZSHの初期化ファイル:

  1. /etc/zshenv
  2. ~/.zshenv
  3. ログインモード:
    1. /etc/zprofile
    2. ~/.zprofile
  4. インタラクティブ:
    1. /etc/zshrc
    2. ~/.zshrc
  5. ログインモード:
    1. /etc/zlogin
    2. ~/.zlogin

enter image description here

参考文献

1
Simba

sshdは、クライアントが実行するコマンドを送信しない場合にログインシェルを実行します。これは、実行するコマンドが与えられていないときにrshサービスではなくrlogindサービスを呼び出していたrshdの動作を模倣するためです。

シェルにrlogindまたはloginまたはtelnetdのようなログインシェルであることを伝えるには、sshdはシェルをargv[0]で開始します-で始まります。

もちろん、他のすべてのシェルのようにzshも同様に理解します。そうしないと、loginモードで呼び出すことができません。

ここで、ログインシェルを取得できなかったと思わせたのは、/etc/profileが解釈されなかったためです。

/etc/profileは、Bourneのようなシェル用のログインセッション初期化ファイルです。そこにある構文は、Bourne Shell構文(または、Bourne Shellが最近ほとんど使用されていないためPOSIX sh構文)であると予想され、構文がBourneまたは(ほとんど)下位互換性のあるすべてのシェルによってログイン時に読み取られます。 POSIX sh構文。

完全に異なる構文を持つcshtcshは、代わりに/etc/csh.loginを使用します。 fish/etc/fish/config.fishを使用します(ログインモードかどうかに関係なく)。

zshの構文もBourne/POSIXの構文と完全に互換性がないため、デフォルトでは/etc/profileを読み取りません。ログインモードでの構成ファイルは/etc/zsh/zprofile(またはzshがビルド時にどのように構成されたかに応じて/etc/zprofile)であり、後者は/etc/zsh/zlogin(または/etc/zlogin)です。 zshrcの後に提供されます。

zshソースのみ/etc/profileshまたはkshエミュレーションの場合、その構文はデフォルトのzshエミュレーションモード。

ログインモードでzshをソース/etc/profileにしたい場合は、source /etc/profile/etc/zsh/zprofileを追加する必要がありますが、それは、 /etc/profileおよびそれがソースとするその他のファイルの構文がzshの構文と互換性があることを確認しました。

または、以下を追加することもできます。

emulate sh -c 'source /etc/profile'

/etc/zsh/zprofile宛て。次に、/etc/profileshエミュレーションモードで供給されます(そこで宣言された関数はshエミュレーションモードも保持します)。

5