bash 中的自动完成别名(或类似的)?

bash 中的自动完成别名(或类似的)?

我的本地网络中有一台 CentOS 主机,我每天都会使用它来打开与 Internet 和本地网络中许多其他主机(超过 40 个)的 SSH 连接。我已设置 RSA 密钥对以跳过交互式身份验证和一些 bash 脚本,如下所示:

[root@beta ~]# cat ~/connections/mywebsite.sh
ssh [email protected]

当我需要打开与它们的连接时,这种方法可以正常工作,但当我需要将scp文件传输到同一主机时,这种方法就不行。

是否可以创建相当于别名的东西来替换这样的用户名@主机部分?

[root@beta ~]# scp myfile MYWEBSITE:/var/www

使用 Tab 键自动完成别名的可能性也非常棒。

我知道 bash 别名只能用作命令的第一个单词,但是还有其他方法可以实现这一点吗?如果不在 bash 中,也许是另一个 shell?

答案1

使用 ssh、scp 和 rsync 的内置功能。

在您的 .ssh 子目录中,创建一个“config”文件。(chmod 0600)

在此,您可以描述用于特定主机(或全局选项)的主机和选项。

使用你的例子:[电子邮件保护]

输入以下内容:

Host MYWEBSITE
  Hostname virtualserver123.hostingprovider.fi
  User mywebsitefi
  Port 22

从现在开始,如果您使用“MYWEBSITE”作为主机名,它将自动提供真实的主机名、用户名、端口、选项以及您指定的任何内容。(我习惯指定端口号)

我自己使用它来为面向互联网的 ssh 服务器指定非标准端口号/

您可以输入:

ssh MYWEBSITE

.ssh/config 文件中的条目将填写 url、用户名、端口和选项。

scp MYWEBSITE:/somepath/somefile /home/me/
rsync -vzP /some/files MYWEBSITE:/my/home/

也能按您期望的方式工作。

如果您在 Host 行中指定多个名称,则可以通过其中任何一个名称来调用它,所有名称都是相同的。

缩进和大写无关紧要,但为了清晰起见,我喜欢这样分解。在 .ssh/config 中放置你需要的任意数量的条目

.ssh/config 必须具有 0600 的权限(rw 用户,其他所有人都无),否则 ssh 将会抱怨并忽略该文件。

当然,ssh(1) 和 ssh_config(5) 手册页中提供了更多信息。

第一个“Host”行之前的任何内容都被视为全局选项,并应用于您定义的所有条目。方便指定连接超时、X11 转发等。

答案2

如果您安装了 bash-completion 包,那么它将根据可以在各个地方找到的信息(例如 .ssh/config、已知主机等)添加 ssh 主机名和别名的自动完成功能。

答案3

如果我理解你的问题,一个 shell 函数就足够了:假设你想对用户、主机和路径进行硬编码:

myscp () {
  scp "$@" user@host:path
}

使用类似

myscp *.html *.css

相关内容