rootログインシェルでファイルを実行すると、 `less`に「このアカウントが利用できません」と表示されるのはなぜですか?

rootログインシェルでファイルを実行すると、 `less`に「このアカウントが利用できません」と表示されるのはなぜですか?

これは実際に質問ではなく、単に知りたい機能です。

ルートシェルを取得してsudo bash -l実行すると、less somefilenameより少ない情報が得られ、以下が表示されます。

このアカウントは現在利用できません。

(これは次のようには表示されません。間違い、ファイルの内容であるかのように less 内に表示されます。 )

ただし、同じルートシェルを使用しsudo bash -lて実行すると、cat somefilename | lessファイルの実際の内容が表示されます。

また、ルートシェルをインポートしてsudo bashスキップして-l実行するless somefilenameと、ファイルの内容が表示されます。

ルートログインが無効になっています。/etc/passwdラインがroot:x:0:0:root:/root:/sbin/nologinまったく機能しませんsudo su -

しかし、このエントリがファイルnologinの実行に影響するのはなぜですか?なぜファイルから直接実行された場合にのみ効果があり、標準入力で実行される場合には効果がありませんかlesslessさらに、なぜbash -lこれはシェルでのみ起こるのですか?

(これはCentOS 7システムにあります。)

答え1

これはless、またはで指定されたコマンドを呼び出す方法が原因で発生します。環境変数が設定されたら、その値をシェルとして使用して実行します。LESSOPENLESSCLOSESHELL

したがって、シナリオでLESSOPEN設定されているとおり(使用後lesspipe)、lessその実行は"$SHELL" -c …その結果がファイルの内容として表示されます(これがパイプラインの予想される動作であるためLESSOPEN)。SHELLis のため、nologinこのコマンドの出力が表示されます。

デフォルト設定では、lesspipeパイプ自体がパイプから入力を受け取ると、パイプは使用されません。これがまさにこの動作を説明することです。less

SHELLログインシェルにのみ設定されます。bashなしで実行すると、以前に持っていたすべての値が保持されます-lSHELL

(実際にless使用するのでpopenrun命令はsh -c "$SHELL" -c …

関連情報