Linux中國

通過 ssh 會話執行 bash 別名

我在遠程主機上上設置過一個叫做 file_repl 的 bash 別名 。當我使用 ssh 命令登錄遠程主機後,可以很正常的使用這個別名。然而這個 bash 別名卻無法通過 ssh 來運行,像這樣:

$ ssh vivek@server1.cyberciti.biz file_repl
bash:file_repl:command not found

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

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

如何用 ssh 客戶端執行命令

通過 ssh 運行 free 命令或 [date 命令](https://www.cyberciti.biz/faq/unix-date-command-howto-see-set-date-time/ "See Linux/Unix date command examples for more info") 可以這樣做:

$ ssh vivek@server1.cyberciti.biz date

結果為:

Tue Dec 26 09:02:50 UTC 2017

或者:

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

結果為:

 total used free shared buff/cache available
Mem:2.0G 428M 138M 145M 1.4G 1.1G
Swap:0B 0B 0B

理解 bash shell 以及命令的類型

bash shell 共有下面幾類命令:

  1. 別名,比如 ll
  2. 關鍵字,比如 if
  3. 函數 (用戶自定義函數,比如 genpasswd
  4. 內置命令,比如 pwd
  5. 外部文件,比如 /bin/date

type 命令command 命令 可以用來查看命令類型:

$ type -a date
date is /bin/date
$ type -a free
free is /usr/bin/free
$ command -V pwd
pwd is a shell builtin
$ type -a file_repl
is aliased to `sudo -i /shared/takes/master.replication'

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

$ ssh user@remote file_repl

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

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

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

ssh 命令選項:

bash shell 的選項:

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

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

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

結果為:

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

下面是我的一個 shell 腳本的例子:

#!/bin/bash
I="tags.deleted.410"
O="/tmp/https.www.cyberciti.biz.410.url.conf"
box="vivek@server1.cyberciti.biz"
[!-f "$I" ] && { echo "$I file not found。"; exit 10; }
>$O
cat "$I" | sort | uniq | while read -r u
do
    uu="${u##https://www.cyberciti.biz}"
    echo "~^$uu 1;" >>"${O}"
done
echo "Config file created at ${O} and now updating remote nginx config file"
scp "${O}" ${box}:/tmp/
ssh ${box} /usr/bin/lxc file push /tmp/https.www.cyberciti.biz.410.url.conf nginx-container/etc/nginx/
ssh -t ${box} /bin/bash -ic 'push_config_job'

相關資料

更多信息請輸入下面命令查看 OpenSSH 客戶端bash 的 man 幫助

$ man ssh
$ man bash
$ help type
$ help command

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

作者:Vivek Gite 譯者:lujun9972 校對:wxy

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


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國