如何設定使用者透過 SSH 連接到伺服器時使用的 shell。例如,我無法忍受 BASH 並且需要使用 ZSH,.zsh_profile
當我 ssh 到機器時,如何才能使 ZSH 與我的設定檔 ( ) 一起載入。
我也不想用 ssh 傳遞一堆參數,我不能設定預設 shell 嗎?
答案1
如果您無法變更預設 shell,ssh -t user@host 'zsh -l'
也可以。
該-t
標誌強制進行偽 tty 分配,並且該-l
標誌產生一個登入外殼。
答案2
假設您在 Linux 上運行,則可以使用該chsh
命令。
chsh -s /bin/ksh foo
chsh -s /bin/bash username
答案3
man chsh
改變外殼,並不總是有效
或者,您可以貼上exec /bin/zsh
bash 登入腳本。
或者你可以這樣做ssh host "zsh -l"
答案4
我不確定如何將本地伺服器轉移.zshrc
到遠端伺服器(即無需將其永久儲存在那裡),這對我來說可以更改遠端伺服器上的登入 shell。
由於它是共享帳戶,因此我只能zsh
自己使用此方法。
將其新增至~/.ssh/config
本機的檔案。
Host yourServer
HostName <IP, FQDN or DNS resolvable name>
IdentityFile ~/.ssh/<your keyfile>
RemoteCommand zsh -l
RequestTTY force
User <yourUsername>
可能有一些黑客方法可以完成您正在尋找的事情,如下所示。
警告 這沒有任何保證,而且看起來並不“明智”,但是我確實設法將本地文件放入伺服器並使用它在登入 shell 中獲取它。
Host someHost
HostName someIP
IdentityFile ~/.ssh/somekey.pem
RemoteCommand zsh -l -c 'sleep 1; source /tmp/somefile; zsh'
PermitLocalCommand yes
LocalCommand bash -c 'sftp %r@%h <<< "put /tmp/somefile /tmp/somefile"'
RequestTTY force
User someUser
怎麼運作的?
RemoteCommand
定義需要在遠端運行的內容。LocalCommand
定義需要在本機上運行的內容,用於將本機檔案複製到遠端伺服器以取得它。這是一個問題,它僅在“成功”連接到遠端主機後才會發生。
意義:
- 您與遠端的連線應該是開放且有效的
- 您的遠端 shell 還沒有該文件,因此它必須等到文件存在,因此
sleep
- 您的本地使用
sftp
將您的文件發送到遠端伺服器,遠端伺服器從您的腳本中喚醒sleep
並獲取您的腳本。
太黑了,我也想知道是否有更好的方法。
更新:這可以用來代替「長」睡眠時間:
RemoteCommand zsh -l -c 'while [[ ! -f /tmp/somefile ]]; do sleep 0.05; done; source /tmp/somefile; zsh'