選擇 SSH 使用的 shell?

選擇 SSH 使用的 shell?

如何設定使用者透過 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/zshbash 登入腳本。

或者你可以這樣做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定義需要在本機上運行的內容,用於將本機檔案複製到遠端伺服器以取得它。這是一個問題,它僅在“成功”連接到遠端主機後才會發生。

意義:

  1. 您與遠端的連線應該是開放且有效的
  2. 您的遠端 shell 還沒有該文件,因此它必須等到文件存在,因此sleep
  3. 您的本地使用sftp將您的文件發送到遠端伺服器,遠端伺服器從您的腳本中喚醒sleep並獲取您的腳本。

太黑了,我也想知道是否有更好的方法。

更新:這可以用來代替「長」睡眠時間:
RemoteCommand zsh -l -c 'while [[ ! -f /tmp/somefile ]]; do sleep 0.05; done; source /tmp/somefile; zsh'

相關內容