2014-11-15 46 views
2

我想將命令綁定到zsh中的一個組合鍵,這在OSX和Linux上是不同的。我目前的狀態是我的終端在哪個操作系統上運行?

if [[ "$(uname)" == "Darwin" ]]; then 
    bindkey "^e" some-command # Ctrl+E for OSX 
else 
    bindkey "^[e" some-command # Alt+E for Linux 
fi 

但是,這不適用於這兩個系統之間的ssh連接。因此,實際上,我不希望在我的OS殼運行在檢查,而是在哪個OS我終端運行中,是否有一種方式來獲得這些信息?

請不要集中在結合使用的密鑰的細節。這不是在這一點:)

編輯相關: 爲了讓事情更清晰:

回答

2

ssh可以給環境變量到服務器,這是否默認爲變量的屈指可數。雖然有關客戶端操作系統的任何信息不是該默認列表的一部分,但它可以擴展。

  1. 您需要設置和導出具有所需信息的變量。你可以用uname輸出去,或者你可以直接複製OSTYPE(你不應該使用OSTYPE直接,因爲改變它可能不是一個好主意)。因此,你需要在兩個系統上像這樣在你的~/.zshrc(頂部的地方之前,你需要它,當然):

    export CLIENT_OSTYPE=${CLIENT_OSTYPE:-$OSTYPE} 
    

    這臺CLIENT_OSTYPEOSTYPE價值,如果它是以前未設置。所以如果你在本地登錄,它將被設置爲OSTYPE。但是,如果您使用ssh登錄,它將被設置爲傳遞的CLIENT_OSTYPE

  2. 現在你必須設置你的SSH客戶端實際上通過CLIENT_OSTYPE到服務器。對於您需要編輯SendEnv進入SSH客戶端配置 - 無論是用戶特定的(~/.ssh/config)或全球(最有可能的/etc/ssh/ssh_config在Linux上,/etc/ssh_config在Mac):

    SendEnv CLIENT_OSTYPE 
    

    它可能已被設置爲在一定的價值全局配置(LANG LC_*在我的情況),在這種情況下,只需添加到列表:

    SendEnv LANG LC_* CLIENT_OSTYPE 
    
  3. 最後,你必須在SSH服務器上配置實際上接受這個環境變量。這可以在/etc/ssh/sshd_config Linux和/etc/sshd_config在Mac上通過修改AcceptEnv來完成:

    AcceptEnv CLIENT_OSTYPE 
    

    類似SendEnv這可能也已經被設置爲某事:

    AcceptEnv LANG LC_* CLIENT_OSTYPE 
    

然後,您可以使用的CLIENT_OSTYPE值來決定要使用的配置。

-1

我想的是,SH命令ell命令arch可能會幫助你。

它還會告訴你,無論你是在32位或64位的MacOS機器。

+1

'arch'只能說明** **殼中也可以運行在系統上的信息,它僅適用於OSX(這將是解決問題的辦法,如果它可以從Linux系統調用 - 但它不能)。 – eugenk

+0

FWIW,[ 「'arch'」 存在於我用的是Linux版本(https://wiki.archlinux.org/index.php/man_page)。 –

+0

噢,那我也沒看到AUR搜索結果的右側包。至少是默認不可用我的ArchLinux的機器上。 – eugenk

相關問題