歡迎光臨
每天分享高質量文章

透過 ssh 會話執行 bash 別名 | Linux 中國

我在遠端主機上上設定過一個叫做 file_repl 的 bash 別名 。當我使用 ssh 命令登入遠端主機後,可以很正常的使用這個別名。然而這個 bash 別名卻無法透過 ssh 來執行
— Vivek Gite


本文導航
編譯自 | https://www.cyberciti.biz/faq/use-bash-aliases-ssh-based-session/ 
 作者 | Vivek Gite
 譯者 | lujun9972

我在遠端主機上上設定過一個叫做 file_repl 的 bash 別名 [1]。當我使用 ssh 命令登入遠端主機後,可以很正常的使用這個別名。然而這個 bash 別名卻無法透過 ssh 來執行,像這樣:

  1. $ ssh vivek@server1.cyberciti.biz file_repl

  2. bashfile_replcommand not found

我要怎樣做才能透過 ssh 命令執行 bash 別名呢?

SSH 客戶端 (ssh) 是一個登入遠端伺服器併在遠端系統上執行 shell 命令的 Linux/Unix 命令。它被設計用來在兩個非信任的機器上透過不安全的網路(比如網際網路)提供安全的加密通訊。

如何用 ssh 客戶端執行命令

透過 ssh 執行 free 命令或 date 命令[2] 可以這樣做:

  1. $ ssh vivek@server1.cyberciti.biz date

結果為:

  1. Tue Dec 26 090250 UTC 2017

或者:

  1. $ ssh vivek@server1.cyberciti.biz free -h

結果為:

  1. total used free shared buff/cache available

  2. Mem2.0G 428M 138M 145M 1.4G 1.1G

  3. Swap0B 0B 0B

理解 bash shell 以及命令的型別

bash shell[3] 共有下麵幾類命令:

☉ 別名,比如 ll
☉ 關鍵字,比如 if
☉ 函式 (使用者自定義函式,比如 genpasswd
☉ 內建命令,比如 pwd
☉ 外部檔案,比如 /bin/date

type 命令[4] 和 command 命令[5] 可以用來檢視命令型別:

  1. $ type -a date

  2. date is /bin/date

  3. $ type -a free

  4. free is /usr/bin/free

  5. $ command -V pwd

  6. pwd is a shell builtin

  7. $ type -a file_repl

  8. is aliased to `sudo -i /shared/takes/master.replication'

date 和 free 都是外部命令,而 file_repl 是 sudo -i /shared/takes/master.replication 的別名。你不能直接執行像 file_repl 這樣的別名:

  1. $ ssh user@remote file_repl

在 Unix 系統上無法直接透過 ssh 客戶端執行 bash 別名

要解決這個問題可以用下麵方法執行 ssh 命令:

  1. $ ssh -t user@remote /bin/bash -ic 'your-alias-here'

  2. $ ssh -t user@remote /bin/bash -ic 'file_repl'

ssh 命令選項:

◈ -t強制分配偽終端。可以用來在遠端機器上執行任意的[6] 基於螢幕的程式,有時這非常有用。當使用 -t 時你可能會收到一個類似 “bash: cannot set terminal process group (-1): Inappropriate ioctl for device. bash: no job control in this shell .” 的錯誤。

bash shell 的選項:

◈ -i:執行互動 shell,這樣 shell 才能執行 bash 別名。
◈ -c:要執行的命令取之於第一個非選項引數的命令字串。若在命令字串後面還有其他引數,這些引數會作為位置引數傳遞給命令,引數從 $0 開始。

總之,要執行一個名叫 ll 的 bash 別名,可以執行下麵命令:

  1. $ ssh -t vivek@server1.cyberciti.biz -ic 'll'

結果為:

Running bash aliases over ssh based session when using Unix or Linux ssh cli

下麵是我的一個 shell 指令碼的例子:

  1. #!/bin/bash

  2. I="tags.deleted.410"

  3. O="/tmp/https.www.cyberciti.biz.410.url.conf"

  4. box="vivek@server1.cyberciti.biz"

  5. [!-f "$I" ] && { echo "$I file not found。"; exit 10; }

  6. >$O

  7. cat "$I" | sort | uniq | while read -r u

  8. do

  9.    uu="${u##https://www.cyberciti.biz}"

  10.    echo "~^$uu 1;" >>"${O}"

  11. done

  12. echo "Config file created at ${O} and now updating remote nginx config file"

  13. scp "${O}" ${box}:/tmp/

  14. ssh ${box} /usr/bin/lxc file push /tmp/https.www.cyberciti.biz.410.url.conf nginx-container/etc/nginx/

  15. ssh -t ${box} /bin/bash -ic 'push_config_job'

相關資料

更多資訊請輸入下麵命令檢視 OpenSSH 客戶端[7] 和 bash 的 man 幫助 [8]

  1. $ man ssh

  2. $ man bash

  3. $ help type

  4. $ help command


via: https://www.cyberciti.biz/faq/use-bash-aliases-ssh-based-session/

作者:Vivek Gite[10] 譯者:lujun9972 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

LCTT 譯者

lujun9972 ? ? ? ?
共計翻譯:75 篇
貢獻時間:55 天


推薦文章

< 左右滑動檢視相關文章 >

點選圖片、輸入文章 ID 或識別二維碼直達

贊(0)

分享創造快樂