Shell

如何使用非預設登錄 shell 進行 ssh 登錄

  • December 9, 2015

我目前在使用 LDAP 進行身份驗證的網路中工作。設置zsh為我的登錄 shell 後,我遇到了一個問題,即通過ssh網路上的一台機器獲得遠端訪問權限,顯然,它沒有zsh安裝。登錄失敗

Dec 8 19:16:11 abert sshd[20649]: User sorokine not allowed because shell /bin/zsh does not exist

所以問題基本上是:如何告訴遠端機器使用與 LDAP 中配置的不同的登錄 shell?

OpenSSH_6.0p1 Debian-4+deb7u2,OpenSSL 1.0.1e

如果您的登錄 shell 無法在某些機器上執行,那麼您就無法通過 SSH 或大多數其他方法登錄它。SSH 伺服器始終執行您的登錄 shell。如果您在ssh命令行上傳遞一個命令,那麼登錄 shell 將使用-c命令字元串¹作為參數執行;否則,登錄 shell 將作為不帶參數的登錄 shell 執行。

如果有辦法繞過登錄 shell,那將是一個安全漏洞。可以通過將其登錄 shell 設置為僅執行一項特定任務的程序來將帳戶配置為受限帳戶;例如,登錄 shell 可能git-shell只允許訪問 git 儲存庫,或rssh等。

要登錄到該機器,您需要安排/bin/zsh在場,或者將您的登錄 shell 更改為存在的東西。

在這樣的異構環境中,我建議堅持/bin/sh作為您的登錄 shell,因為它無處不在。將SHELL環境變數設置為(/bin/zsh如果存在),這樣您就可以將 zsh 作為互動式 shell。

if [ -x /bin/zsh ]; then
 export SHELL=/bin/zsh
fi

當您使用它時,這可以讓您避免硬編碼到zsh.

if SHELL=$(command -v zsh); then
 export SHELL
else
 unset SHELL
fi

要讓 zsh 在文本模式登錄時自動執行,請從您的.profile. 如果您想使用.zprofile它來進行設置,請將其設置為登錄 shell(但是在不存在 zsh 的機器上您將無法獲得相同的環境,因此我不推薦這樣做)。僅當這是互動式登錄時才執行此操作,而不是當您.profile由腳本執行時,在 GUI 模式登錄期間等。

if case $- in *i*) true;; *) false;; esac &&  # interactive shell
  [ -z "$ZSH_VERSION" ] &&                   # not running zsh yet
  type zsh >/dev/null 2>/dev/null; then      # zsh is present
 exec zsh
fi

¹ SSH 客戶端將其非選項參數與中間的空格連接起來,並通過連接發送結果字元串。SSH 協議將命令定義為字元串,而不是字元串列表。

引用自:https://unix.stackexchange.com/questions/248160