非対話型のログインシェルはありますか?


14

対話型/非対話型シェルとログイン/非ログインシェルの違いは知っていますが、実際にはスクリプトのようなものがない限り、非対話型ログインシェルになることはないようです/bin/bash --login some-script.sh(さらには少し奇妙な)。これは正しいですか、それともより一般的ですか?


7
telnet towel.blinkenlights.nl非対話型のログインシェルの場合;-)
マーティントゥルノイ

1
この質問は、この長い回答の中で簡単に回答されます。
ワイルドカード

@CaptainMan:答えを見ると、「インタラクティブ」のまったく異なる意味に焦点を当てた2つがあります。これに照らして、質問をしたときにどの意味を使っていたかを説明するために、少し答えを広げることができますか?
カートJ.サンプソン

回答:


10

マンページの「呼び出し」セクションで説明されているように、Bashのログイン対非ログインおよび対話型対非対話型のBashシェルの概念について話していると思います。(これは、ファイル内の「シェル」(またはユーザーコマンドインタープリター)として使用される任意のコマンドのJames Youngmanの回答の解釈と、passwd(5)そのプログラムがユーザー入力を受け入れるかどうかとは異なります/usr/sbin/nologin。 )

/bin/bash --login some-script.sh非対話型ログインBash呼び出しを生成するのは正しいことであり、これはおそらく病理学的な例です。非対話型のログインシェルを生成する1つのケースがありますssh somehost < some-file。ここでsshdは、実行するコマンドが与えられていないため、Bashをargv[0]setで起動し、Bash -bashはログインシェルと見なしますが、stdinは端末に接続されていないため、Bashは対話モードに設定され$-ません(を含まないi) 。

(個人的には、この場合は逆の場合よりもはるかに合理的であると思われssh somehost somecommandますsomehost。これは、上記とまったく同じように新しいログインであっても、「ログインシェル」とは見なされません。)

私は最近、私がずっと前にすべきだったことをし、Bashのモードと実行される初期化ファイルの表をまとめました。わかりにくい場合は、少なくとも私も同じように気をつけてください。それは、彼らが本来の目的がいつ.bashrc実行されるかについてのルールにあったものであるかを私に迷惑をかけます。


1

実際に、新しくインストールされたシステムでは、ほとんどのログインシェルは非対話型です。

$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c
  5 /bin/bash
 23 /bin/false
  1 /bin/sh
  1 /bin/sync
 17 /usr/sbin/nologin

明らかに/bin/bash/bin/sh伝統的なシェルであり、それらはインタラクティブです。ただし、そのリストの他のすべてのアイテムは非インタラクティブです。リストを読んでいて、そのうちの1つが何をするのかわからない場合は、そのマニュアルページを(たとえばman nologinまたはでman sync)調べることができます。

コマンドが実際に行うこと

Captain Manの投稿履歴を見ると、彼らはUnixにかなり慣れていないことがわかります。したがって、単に出力ではなく、回答の先頭にあるコマンドラインに関連していないというコメントの質問があります。そのため、コマンドラインについても説明しますが、それはこの質問では本当に話題外です。

コマンドはUnixパイプラインです。パイプラインはコマンドのチェーンです-左から右に読む-最初のコマンドの出力は2番目のコマンドの入力になり、2番目の出力は3番目の入力になります。パイプラインの終わり。最後のプロセスの出力は、端末に表示されます(リダイレクトされていない限り)。詳細については、シェルパイプラインに関するWikipediaのエントリを参照しください。

パイプラインが何をしているのかわからない場合は、セグメントで単純に実行して、何が起こっているかを確認できます。また、使用されているコマンドのマニュアルページを読むこともできます(ここではawksortおよびuniq)。実際、今すぐそれを行う必要があります。待ちます。

パイプラインの段階をインクリメンタルに実行してみましょう(独自のUnixシステムで安全に実行できます)。

~$ awk -F:  '{print $7}' <  /etc/passwd | sed -e 's/^/    /'
/bin/bash
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/sync
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/usr/sbin/nologin
[ ... and so on, I've left the rest out ... ]

上記の出力は、/etc/passwdファイルの7番目のフィールドの内容です。それは、すべてのユーザーのログインシェルが何であるかをシステムに伝える(フラットテキストファイル)データベースです。もっと知りたい場合は、それを/etc/passwd読んで(世界中で読める)、マニュアルページを見てください(man 5 passwd)

リスト全体を読むと、人気のあるアイテムが何であるかを知ることができますが、それはこの質問への回答には適した形式ではありません。それらを数えましょう。これを行う最も簡単な方法は、最初にアイテムを並べ替えることです。

~$ awk -F:  '{print $7}' <  /etc/passwd | sort
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
[ ... and so on, I've left the rest out ... ]

プログラムuniqを使用して、一意のアイテムのみを表示できます。

〜$ awk -F: '{print $ 7}' </ etc / passwd | 並べ替える| ユニック| sed -e 's / ^ / /' / bin / bash / bin / false / bin / sh / bin / sync / usr / sbin / nologin

しかし、待って、それは役に立たない、それぞれがいくつあったのか?質問しましょうuniq(manページを読んでください!):

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c
      5 /bin/bash
     23 /bin/false
      1 /bin/sh
      1 /bin/sync
     17 /usr/sbin/nologin

もちろん、これが答えの一番上にある出力です。もう一度並べ替えて、エントリを順番に確認します。

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c | sort
     17 /usr/sbin/nologin
      1 /bin/sh
      1 /bin/sync
     23 /bin/false
      5 /bin/bash

ちなみに、17は1の前にあり、5は23の後にあります。問題は、アイテムが辞書式にソートされていることです。sortそれらを数値的に、逆の順序で並べ替えてみましょう:

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c | sort -n -r
     23 /bin/false
     17 /usr/sbin/nologin
      5 /bin/bash
      1 /bin/sync
      1 /bin/sh

私はそれが元の答えのすべてを説明すると思う。これらのコマンドの機能の詳細がまだ不明な場合は、マニュアルページをご覧ください。何が起こっているかの原則がまだ不明な場合は、UnixとLinuxについて説明している本(オンラインまたは紙)を読むことから始める方が良いかもしれません。


もう少し説明してもらえますか?私が読んでいるものをフォローしているのかわかりません。
キャプテンマン

ある/bin/syncシェルは?どのユーティリティもシェルですか?
eloone

@elooneには、「シェル」には2つ(おそらく3つ)の意味があります。1つは、パスワードデータベースでログインシェルとして構成されたプログラムです。これは、「非対話型ログインシェル」というフレーズが意図する単語の意味です。もう1つの意味は、「Unixシステムでの日常的なインタラクティブな作業に適したREPL」です。これらはインタラクティブです。ただし、REPLコンテキストで使用可能なプログラムのほとんどは、ある種のスクリプト言語のインタープリターとしての非対話型の使用もサポートしています(ただし、「シェルスクリプト」はほとんどの場合「ボーンファミリーシェルスクリプト」を意味します)。
ジェームズヤングマン

2
別の質問に答えているようです。使用可能なシェルを一覧表示しているだけで、一部のシェルはインタラクティブにならないことを指摘しています。OPは、非インタラクティブなログインシェルが実際に出くわすことはないかと尋ねていると思います。そのため、たとえばbashなどの対話型のシェルが非対話型のログインシェルを起動するかどうかは関係ありません。言い換えれば、ここでの「ログインシェル」は「ユーザーのデフォルトログインシェル」を意味するのではなく、ログインシェルとして起動されたシェルを意味しますunix.stackexchange.com/a/46856/22222
terdonを

1
または、ポスターbash --loginが質問に明示的に書いていることを考えるとbashiオプションが設定されていないプロセスについて具体的に尋ねているのかもしれません。(これらはBashのマンページのINVOCATIONセクションでssh somehost < script.sh指定された意味での「ログイン、非対話型」シェルなどのコマンドから発生します。)
Curt J. Sampson
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.