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

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

一部のATMマシンで奇妙な動作が発生します。少なくとも私と私の同僚には奇妙に見え、何も説明が見つかりませんでした。 :)

[編集1]
次の段落が間違っているようです。最後の編集2を参照してください。
ここではbashとzshを使用します。したがって、ssh login@hostzshをデフォルトのシェルとして使用するように構成されている一部のzsh-default-machines(plain)にSSHを介して接続するときchsh -s /usr/bin/zshに開かれるシェルは、対話型ですが対話型です。ログインしていませんそのコンピュータにすでにログインしているかどうかに関係なく、シェル。

私の理解によると、SSHを介してコンピュータに接続すると、そのコンピュータで新しいユーザーセッションが開始される必要があるため、必要なシェルはログインシェルです。 zshもこれと同じでなければなりませんか?

コンピュータのデフォルトシェルをbashに変更する場合は、ログインシェルを使用してコンピュータにログインします。

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

[編集2] いいですね。 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/profileprofile.dフォルダのスクリプトをソースとして使用する場合です。
[/編集2]

[編集3 - 回答] 下記のコメントに返信いただいた@StéphaneChazelasに感謝します!ソーシングはzsh/ compatibilityモードで実行されている場合にのみ発生するようです/etc/profile(該当するmanエントリを参照)。shkshhttps://linux.die.net/man/1/zsh)。 SSH経由でログインすると、この互換モードは実行されないため、必ずしも独自に取得するzsh必要はありませんが、[/edit 3]で実行する必要があります。/etc/profile.zprofile

システム:オペレーティングシステム:Ubuntu 18.04 zsh-5.4.2、omz、および一部のプラグインが有効になっています。

ありがとうございます!

答え1

これがZSHの仕組みです。/etc/profileZSH用の初期化ファイルではありません。。 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

ここに画像の説明を入力してください。

ヒント:

  • Linux端末で開かれるデフォルトのシェルは、非ログインの対話型シェルです。しかし、macOSではログインシェルです。

引用する

答え2

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

rlogindまたはloginなどのログインシェルであることをシェルに通知するには、としてtelnetdシェルsshdを起動します。argv[0]-

あるいは、もちろんzsh他のすべてのシェルも同様に理解しています。そうしないと、呼び出すことはできません。ログインモデル。

ここでログインシェルが出ないような症状は/etc/profile説明がないからです。

/etc/profileBourne Shellに似たログインセッション初期化ファイル。構文はBourneシェル構文(またはBourneシェルが現在ほとんど使用されていないため、POSIX sh構文である可能性があります)であると予想され、ログイン時にすべての構文は(ほとんど)BourneまたはPOSIX sh構文と逆互換です。

cshそしてtcsh完全に異なる構文を使用してください/etc/csh.loginfish使用済み/etc/fish/config.fish(ログインモードかどうか)

zshの構文はBourne / POSIXと完全に互換性がないため、デフォルトでは読みません/etc/profile。ログインモードの設定ファイルは/etc/zsh/zprofile(またはビルド時の設定方法/etc/zprofileによって異なります)。zsh/etc/zsh/zlogin/etc/zloginzshrc

zshソースはエミュレーションまたはエミュレーション/etc/profile時にのみ提供されます。この場合、構文はデフォルトのエミュレーションモードよりもPO​​SIX shの構文に近いです。shkshzsh

ログインモードでzshソースを取得するには、追加する必要があります/etc/profilesource /etc/profileただし、の構文とそのファイルがソースとして使用されている他のすべてのファイルがその構文と互換性があることを確認した場合にのみ適用されます/etc/zsh/zprofile/etc/profilezsh

または、以下を追加できます。

emulate sh -c 'source /etc/profile'

到着する/etc/zsh/zprofile。その後、エミュレーションモードから取得/etc/profileしますsh(そしてその中で宣言された関数もエミュレーションモードのままですsh)。

関連情報