対話型ログインと非対話型非ログインシェルを区別する


25

ログイン、非ログイン、インタラクティブ、非インタラクティブの 4つの用語を区別しようとしています

  • インタラクティブ-ログインシェル
  • インタラクティブ-非ログインシェル
  • 非対話型-ログインシェル
  • 非対話型-非ログインシェル


対話型-非ログインシェルを理解している場合:システムを起動し、システムにログインしてターミナルを開き、
非対話型-ログインシェル:システムにtelnetしてログインします

しかし、インタラクティブなログインシェルはどうでしょうか?
システムにログインし、仮想端末を開いてログインしますか?および
非対話型-非ログインシェル、crontabで自動スクリプトを実行していますか?

回答:


38

あなたが持っているように見える唯一の本当の誤解は、非インタラクティブなログインシェルを構成するものについてです。

簡単に(詳細についてはこちらを参照)、例を挙げます:

  • 対話型ログインシェル:たとえば、を介してリモートコンピューターにログインしますssh。または、ローカルマシン(Ctrl+ Alt+ F1)のttyにドロップして、そこにログインします。

  • 対話型の非ログインシェル:新しいターミナルを開きます

  • 非対話型、非ログインシェル:スクリプトを実行します。すべてのスクリプトは独自のサブシェルで実行され、このシェルは対話型ではありません。スクリプトを実行するためだけに開き、スクリプトが終了するとすぐに閉じます。

  • 非対話型ログインシェル:これは非常にまれであり、遭遇する可能性は低いです。1つを起動する方法の1つですecho command | ssh serversshコマンドなしで起動された場合(リモートシェルで実行されるssh代わりに)、ログインシェルが起動します。場合のがTTYではない、それは非対話型シェルを起動します。これが、非対話型ログインシェルを起動する理由です。で開始することもできます。ssh commandcommandstdinsshecho command | ssh serverbash -l -c command

これを試してみたい場合は、次のようにさまざまな種類のシェルをテストできます。

  • このシェルはインタラクティブですか?

    $-変数の内容を確認してください。対話型シェルの場合、次のものが含まれますi

    ## Normal shell, just running a command in a terminal: interacive
    $ echo $-
    himBHs
    ## Non interactive shell
    $ bash -c 'echo $-'
    hBc
  • これはログインシェルですか?

    これを確認する移植可能な方法はありませんが、bashの場合、login_shellオプションが設定されているかどうかを確認できます。

    ## Normal shell, just running a command in a terminal: interacive
    $ shopt login_shell 
    login_shell     off
    ## Login shell; 
    $ ssh localhost
    $ shopt login_shell 
    login_shell     on

これらすべてをまとめると、考えられる各タイプのシェルの1つです。

## Interactive, non-login shell. Regular terminal
$ echo $-; shopt login_shell
himBHs
login_shell     off

## Interactive login shell
$ bash -l
$ echo $-; shopt login_shell
himBHs
login_shell     on

## Non-interactive, non-login shell
$ bash -c 'echo $-; shopt login_shell'
hBc
login_shell     off

## Non-interactive login shell
$ echo 'echo $-; shopt login_shell' | ssh localhost
Pseudo-terminal will not be allocated because stdin is not a terminal.
hBs
login_shell     on

私はそれをクリアしたい1)guiへのログインはシステムを起動し、システムにログインしてターミナルを開くことを意味します2)telnetまたはsshを行うことは対話型ログインシェルを意味します non-interactive login shell
デイジー

@daisyは説明をありがとう。回答を編集しました。
テルドン

わかりました、GUIは無関係で、対話型の非ログインシェルです。Telnetまたはsshを介してローカルまたはリモートで新しいターミナルを開くだけです
デイジー

@daisyうん、正しいと思う。ただし、基本的にこれはセマンティクスの問題であり、シェルによって読み取られるスタートアップファイルのみに影響することを説明しているため、Muruの回答も注意深くお読みください。また、さまざまなシェルタイプのより包括的な概要については、こちらを参照してください。
テルドン

非インタラクティブなログインシェルはそれほど珍しくありません。たとえば、gitはシェルを使用します。IIRC。
-quazgar

6

基本的に、シェルがログインであるかどうか、インタラクティブであるかどうかは、1つの理由だけで重要です。

初期化ファイルとデフォルトのオプションセットは、シェルがログインしているかどうか、および対話型かどうかによって異なります。

同様に、シェルがログインしているか、対話型であるかどうかは、使用される呼び出し(正確なコマンド名とオプション)のみに依存します。

それ以外の場合、2つのプロパティは直交します。シェルがログインしているかどうかは、シェルが対話型かどうかの判断に影響しません。

次のいずれかに該当する場合、Bashはログインシェルを開始します。

  • argv[0]、起動されたコマンドの名前は、 -
  • -lオプションが指定されています

同様に、bashは次のいずれかに該当する場合、インタラクティブシェルを開始します。

  • 実行するファイル(コマンドが指定されていないbash some/file)または実行するコマンド文字列(bash -c 'foo')が指定されていません(実際の状態はもう少し複雑です。マニュアルを参照してください)
  • -iオプションを指定しました

特に(逆説的に)、後者bash -ic 'foo'は対話型シェルを開始することを意味します。

そのため、次の例では、対話型のログインは何も関係なく、呼び出しはログインとは無関係であるにもかかわらず、ログイン型の対話型シェルを開始します。

bash -lic true

コンソールまたはGUIを介してログインすると、ログインシェルが起動する(または起動しない可能性がある)ことは、適切な呼び出しを使用したログインプロセスの影響です。

条件と効果の詳細については、bashマニュアルの「スタートアップファイル」セクションを参照してください


混乱の主な原因は、「ログイン」シェルには別の一般的な意味があることです。

ユーザーのログインシェルは、そのユーザーのpasswdエントリで定義されているシェルです(/etc/passwdLDAP、または他のソースから取得される場合があります)。

loginプログラム等、SSHは、このシェルを起動し、ログインをリードして-その答えの残りの部分に意味意味で、シェル-は通常、コマンド名に。特に混乱させたい場合は、次のように言うことができます。

一部のログインプロセスは、ログインシェルとしてユーザーのログインシェルを開始します。

開発者が便利だと思ったため、GUIログインは純粋にログインシェルを開始することに注意してください-LightDMはログイン時にスクリプトを実行します。これは明らかにインタラクティブではなく、ユーザーのログインシェルに依存しません ただし、ディスプレイマネージャーがログインシェルを起動することに依存しないでください。すべてがそうするわけではなく、WaylandとGNOMEでは、ログインプロセスはシェルスクリプトをまったく使用しません。


3

ログインシェル:

セッションにログインしたときにユーザーIDで実行される最初のプロセス。ログインプロセスは、シェルに、通常はシェル実行可能ファイルの名前である引数0を「-」文字を前に付けて、ログインシェルとして動作するように指示します。

インタラクティブシェル:

ttyのユーザー入力からコマンドを読み取ります。特に、このようなシェルは、アクティベーション時にスタートアップファイルを読み取り、プロンプトを表示し、デフォルトでジョブ制御を有効にします。ユーザーはシェルと対話できます。スクリプトを実行するシェルは常に非対話型シェルです。

簡単に言えば、インタラクティブシェルはユーザー入力を必要としますが、非インタラクティブシェルはスクリプトによって実行され、ユーザー入力を必要としません。


したがって、与えられた例は正しいです。
デイジー

はい、適切な場所でデイジーを使用します。
ジョージ・ウドセン

1
@daisy no!GUIはそれとはまったく関係ありません。これは、コマンドシェルであり、グラフィカルシェルではありません(グラフィカルシェルも存在しますが、別の獣です)。
テルドン

1
@Georgeいいえ、2つの間違いがあります:GUIを介してログインするとログインシェル(または他の種類の関連シェル)が起動せず、telnetを介してリモートシステムにログインするとtelnetシェルが起動しますが、sshを介して対話型ログインが開始されますシェル。
テルドン

1
実際、@ Georgeは修正済みです。一部のGUIログインマネージャは、ログインシェルを起動して読み取ることができます.profile.profile手動でソースを取得していると思っていましたが、間違っている可能性があります)。
テルドン

0

インタラクティブログインシェルは次の方法で起動できます。

  1. sudo /bin/login資格情報の実行と入力
  2. 実行中 exec -l /bin/bash
  3. 実行中 su -
  4. 上記の回答のように、sshを使用してリモートマシンにログインします

また、入力することでシェルがログインしているかどうかを(bashで)チェックできecho $0、出力がダッシュ-で始まる場合はログインシェルです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.