如何在基于ssh的会话上使用/运行bash别名

时间:2020-01-09 10:44:02  来源:igfitidea点击:

我已经建立了一个名为file_repl的bash别名。
当我使用ssh命令登录时,它完全可以工作。
但是,我的bash别名未在ssh上运行,例如:$ssh [email protected] file_repl bash:file_repl:命令未找到

使用ssh命令时如何运行bash shell别名?

SSH客户端(ssh)是Linux/Unix/macOS/* BSD命令,用于登录到远程服务器并在远程系统上执行shell命令。
它旨在通过不安全的网络(例如Internet)在两个不受信任的机器之间提供安全的加密通信。

如何使用Linux ssh客户端运行或者执行命令

要使用ssh运行免费命令或者日期命令:

$ ssh [email protected] date

输出示例:

Tue Dec 26 09:02:50 UTC 2016

或者

$ ssh [email protected] free -h

输出示例:

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

了解bash的命令和命令类型

bash shell可以理解以下类型的命令:

  • 别名,例如ll
  • 关键字,例如
  • 函数(用户定义的函数,例如genpasswd)
  • 内置如pwd
  • /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'`

date和free都是外部命令,file_repl的别名为sudo -i /shared/takes/master.replication。
一个不能简单地执行诸如file_repl之类的别名命令:

$ ssh user@remote file_repl

如何使用ssh客户端运行bash别名

让我们看看在Linux,macOS,* BSD和类似Unix的系统上使用ssh命令运行bash shell别名的命令行语法。

Bash别名无法在基于Unix的系统上运行或者无法通过ssh客户端运行

要解决此问题,请按以下方式运行ssh命令:

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

其中ssh命令选项:

  • -t:强制伪终端分配。这可用于在远程计算机上执行任意基于屏幕的程序,这可能非常有用。如果没有将-t选项传递给ssh,您将得到一个错误,显示为bash:无法设置终端进程组(-1):设备的ioctl不适当。 bash:此shell中无作业控制。

其中bash shell选项如下:

  • -i:使shell是交互式的,以便它可以运行bash别名
  • -c:从第一个非选项参数command_string中读取命令。如果在command_string之后有参数,则将它们分配给位置参数,从$0开始。

简而言之,运行以下命令来运行名为ll的bash别名:

$ ssh -t [email protected] /bin/bash -ic 'll'

会话示例:使用Unix或者Linux ssh cli时,在基于ssh的会话上运行bash别名

这是我的示例shell脚本:

#!/bin/bash
I="tags.deleted.410"
O="/tmp/https.www.theitroad.local.410.url.conf"
box="[email protected]"
[ ! -f "$I" ] && { echo "$I file not found."; exit 10; }
>$O
cat "$I" | sort | uniq | while read -r u
do
	uu="${u##https://www.theitroad.local}"
	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.theitroad.local.410.url.conf nginx-container/etc/nginx/
ssh -t ${box} /bin/bash -ic 'push_config_job'