我的本地网络中有一台 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