これは実際に質問ではなく、単に知りたい機能です。
ルートシェルを取得して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
の実行に影響するのはなぜですか?なぜファイルから直接実行された場合にのみ効果があり、標準入力で実行される場合には効果がありませんかless
?less
さらに、なぜbash -l
これはシェルでのみ起こるのですか?
(これはCentOS 7システムにあります。)
答え1
これはless
、またはで指定されたコマンドを呼び出す方法が原因で発生します。環境変数が設定されたら、その値をシェルとして使用して実行します。LESSOPEN
LESSCLOSE
SHELL
したがって、シナリオでLESSOPEN
設定されているとおり(使用後lesspipe
)、less
その実行は"$SHELL" -c …
その結果がファイルの内容として表示されます(これがパイプラインの予想される動作であるためLESSOPEN
)。SHELL
is のため、nologin
このコマンドの出力が表示されます。
デフォルト設定では、lesspipe
パイプ自体がパイプから入力を受け取ると、パイプは使用されません。これがまさにこの動作を説明することです。less
SHELL
ログインシェルにのみ設定されます。bash
なしで実行すると、以前に持っていたすべての値が保持されます-l
。SHELL
(実際にless
使用するのでpopen
run命令はsh -c "$SHELL" -c …
)