作者 | Vivek Gite
譯者 | lujun9972
我在遠端主機上上設定過一個叫做 file_repl 的 bash 別名 [1]。當我使用 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 命令[2] 可以這樣做:
$ 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[3] 共有下麵幾類命令:
ll
if
genpasswd
)pwd
/bin/date
type 命令[4] 和 command 命令[5] 可以用來檢視命令型別:
$ 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'
date
和 free
都是外部命令,而 file_repl
是 sudo -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
命令選項:
-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 別名,可以執行下麵命令:
$ 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 客戶端[7] 和 bash 的 man 幫助 [8]:
$ man ssh
$ man bash
$ help type
$ help command
via: https://www.cyberciti.biz/faq/use-bash-aliases-ssh-based-session/
作者:Vivek Gite[10] 譯者:lujun9972 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出