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


2

我在我的本地网络中有一个CentOS主机,我每天用它来打开与Internet和本地网络中许多(超过40个)其他主机的SSH连接。我已经设置了RSA密钥对来跳过交互式身份验证和一些像这样的bash脚本:

[root@beta ~]# cat ~/connections/mywebsite.sh
ssh mywebsitefi@virtualserver123.hostingprovider.fi

当我需要打开它们的连接时,这可以正常工作,但不是在我需要的时候 scp 文件到同一主机。

有可能创建一个等同于别名的东西来替换这样的用户名@ host部分吗?

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

使用tab键自动完成别名的可能性也很棒。

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

Answers:


7

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

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

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

使用您的示例:mywebsitefi@virtualserver123.hostingprovider.fi

输入以下内容:

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

从这一点开始,如果你使用'MYWEBSITE'作为主机名,它将自动提供真正的主机名,用户名,端口,选项,无论你指定什么。 (我按习惯指定端口号)

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

你可以输入:

ssh MYWEBSITE

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

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

按照你的期望工作。

如果在主机行中指定了多个名称,则可以通过任何这些名称来调用它们,所有这些名称都相同。

缩进和大写是无关紧要的,但为了清楚起见,我想像这样拆分它。在.ssh / config中放置所需数量的条目

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

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

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


谢谢,这个和@ eldering的答案结合在一起正是我想要的!
Kaivosukeltaja

3

如果您安装了bash-completion软件包,那么将根据可以在各种位置找到的信息添加ssh主机名和别名的自动完成,例如.ssh / config,已知主机等。


0

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

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

用得像

myscp *.html *.css
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.