如何使用非預設登錄 shell 進行 ssh 登錄
我目前在使用 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 協議將命令定義為字元串,而不是字元串列表。