當我 ssh 進入 ubuntu 機器時,我使用哪種 shell

當我 ssh 進入 ubuntu 機器時,我使用哪種 shell

我一直在閱讀有關互動式、非互動式、登入和非登入 shell 的內容。

(這是在讀取 .bash* 檔案的上下文中)。

我不太明白每種類型的 shell 是什麼,所以我們先從基礎開始。

如果我從 mac 到 ubuntu 機器,會啟動什麼類型的 shell?

答案1

如果您透過 SSH 連線到 Ubuntu 機器,您將獲得一個互動式登入 shell。區別如下:

  • 互動式與非互動式:任何可以在提示字元處鍵入的 shell 都是互動式的。事實上,許多腳本都會測試$PS1保存提示字串的變數來確定它們是否是互動的。如果 shell 正在執行 shell 腳本,那麼它是非互動式的。

    因此,如果您這樣做ssh yourbox.example.com,您將獲得一個互動式 shell(假設預設),而如果您這樣做ssh yourbox.example.com mighty_shellscript.sh,您最終將獲得一個非互動式 shell,並且您的 SSH 會話將在腳本終止時終止。

  • 登入與非登入:當您從控制台或遠端(例如 SSH)登入時,或將選項傳遞-l給時bash,您將獲得登入 shell。否則,例如當您開啟終端機視窗時,您將得到一個非登入 shell。

    若要測試 shell 是否是登入 shell,請檢查其命令名稱是否為-bash而不是bash

    ps -ef | grep [b]ash
    

答案2

您將獲得一個互動式登入 shell。但不要認為這是理所當然的,你自己檢查一下。

這告訴您您有一個登入 shell(來自man bash):

# shopt | grep login
login_shell     on

這告訴您您有一個互動式 shell,尋找i(來自man bash):

# echo $-
himBH

您獲得的互動式登入 shell 已讀取、和/etc/profile之一,如下所述:~/.bash_profile~/.bash_login~/.profileman bash

當 bash 作為 互動式登入 shell,或作為具有 --login 選項的非互動式 shell,它首先從檔案 /etc/profile 讀取並執行命令(如果該檔案存在)。讀取該檔案後,它會按順序查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,並從第一個存在且可讀的檔案中讀取並執行命令。 啟動 shell 時可以使用 --noprofile 選項來禁止此行為。

答案3

SSH(1)手冊頁說,

如果命令指定後,它會在遠端主機上執行,而不是在登入 shell 上執行。

當伺服器接受使用者的身份時,伺服器要么執行給定的命令,要么登入電腦並為使用者提供遠端電腦上的普通 shell。

這些向我表明您獲得的 shell 是登入 shell。

答案4

試試這個命令。

[max@localhost ~]$ echo $SHELL
/bin/bash

您得到此輸出是因為您的 shell 類型儲存在該變數中SHELL

若要了解您的環境變量,請輸入此命令

[max@localhost ~]$ 環境
主機名稱=localhost.localdomain
外殼=/bin/bash
歷史大小=1000
用戶=最大

鍵入時echo $SHELL將列印此處儲存的值

每次啟動時都會更新該值

相關內容