我如何pipe理经常访问的主机列表?

如何快速select并login到需要通过ssh访问的多个主机? 我正在构build一个如下所示的shell脚本,它使用dialog从命令行显示主机菜单,但我很好奇是否有更好的方法。

 #!/bin/dash tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$ trap "rm -f $tempfile" 0 1 2 5 15 while [ 1 ] do dialog --menu "Select Host" 0 0 0 \ "hostname1" "Host description 1" \ "hostname2" "Host description 2" \ "hostname3" "Host description 3" 2> $tempfile HOSTNAME=`cat $tempfile` if [ "x" = "x$HOSTNAME" ]; then break fi ssh $HOSTNAME done 

我喜欢让每个主机在客户端机器的〜/ .ssh / config文件中设置一个简短的名字。 这是一个例子:

 Host host1 HostName longhostname.mydomain.com User remoteuser IdentityFile ~/ssh-keys/id_rsa-my-keypair 

这样我可以input“ssh host1”并立即login。

对于基于GUI的解决scheme,请查看SSHmenu 。

对于频繁的login我通常依靠短的主机名。 我们公司的DNS包含了大部分,其余的都在/ etc / hosts中。 与ssh代理相结合,这对我来说足够方便。 哦,是的,还有:肌肉记忆。 当我想到一个主机名的时候,如果我的手指离键盘足够近的话,它会神奇地出现在屏幕上。

对于频率较低的命令,我通常依赖于命令历史logging(如果它们不是那么罕见的话)或Wiki(它们被logging)(复制/粘贴)。 这种方法的优点是,不太频繁的任务或多或less保证完整地logging。

我想过玩自动化命令完成,所以ssh会自动扩展“标签”上的频繁主机名,但直到今天我还没有太多错过这个…有一天,我会…

老实说,我可以键入ssh user@host或当我在Windows winkey+r then putty <server>比任何菜单系统更快。 这和我尽可能避免使用鼠标,因为时钟的滴答在一天结束时加起来。

我有一个摄影记忆,所以只记得他们的IP地址,伤心,我知道,但我必须说一些好处:)

我更喜欢小的shell脚本或shell别名。 在最好的UNIX传统中,我尽可能简短地命名它们以最小化打字。

例如,我有一个别名“ns1”,它是login到我维护的(显然)名字服务器所需的单行SSH命令。

通常,命令名称是机器名称的简短助记符,该名称的未加前缀的版本默认为ssh。 所以“ns1”将ssh进入,并且(如果它是一个Windows盒子)别名“rns1”可能会启动远程桌面客户端命令到该机器。

如果我有这么多,我不能跟踪所有的脚本,我会使用shell脚本方法,并在每一个评论中保留一个描述行,所有脚本的通用标记。 然后,我会写一个小脚本,将打印出我的自定义脚本目录中的每个文件的名称,然后是从该注释行中删除的任何文件。 运行一个脚本,然后将每个命令和它做的事情logging到屏幕上。

我前几天才知道,你可以使用~/.ssh/config来使得这个过程非常轻松。

该文件中的条目如下所示:

 Host short User joni HostName short.foo.bar.domain.fi 

(在这种情况下, User可以省略当前用户名。)

那么你可以使用简短的主机名: ssh short 。 或者启用bash-completion,你只要input类似ssh sh ,hit tab就可以了。

这和Ctrl-R命令的历史loggingsearch使SSH'ing到我最喜欢的主机很容易。

如果您想要加快连接速度,那么使用OpenSSH客户端的ControlPath / ControlMasterfunction可以帮助并充分利用大多数连接被轻易使用的情况,因此可以通过一个TCP连接复用多个login。 ~/.ssh/config被parsing,所以对于任何configuration选项,使用find的第一个匹配,所以你可以做这样的事情:

 Host *-nomaster ControlMaster no ControlPath none Host * ControlPath ~/.ssh/cp/%h-%p-%r Host *-master ControlMaster yes Host foobar foobar-master foobar-nomaster Hostname foobar.example.org 

当然你也需要mkdir ~/.ssh/cp

然后,我只是使用标签完成许多命令,包括SSH的tab完成。 对于ssh,它将更喜欢来自known_hosts文件(用户和系统)的主机,但是如果主机前缀不匹配,将使用〜/ .ssh / config主机规则。

 屏幕 

然后,我把他们打开。

什么是你最喜欢的工具或方法来快速login到你需要通过SSH访问的主机?

我使用脚本,但我真的很喜欢使用iterm,它是书签function。

当然,使用鼠标点击鼠标并在列表中find“a”服务器需要更多的时间,而不是将其打包到命令行中。 但iTerm确实有键盘快捷键。

通过书签,我可以在逻辑文件夹(生产/networking或生产/区域/networking)中将服务器组群集成在一起。 我有超过一百个服务器来照顾:记住他们的所有名字不会发生,更不用说试图回忆哪些服务器属于我的JDE场,哪些是我的BOM应用程序群集。

特别是在03:00时,东西坏了。

如果你有bash作为你的shell,你可以使用下面的代码片段来使用你的known_hosts文件来进行bash_completion:

 complete -W “$(echo `cat ~/.ssh/known_hosts | cut -f 1 -d ' ' | sed -es/,.*//g | uniq | grep -v “\[“`;)” ssh 

如果你散列已知的主机,这是行不通的,所以你必须parsing其他东西,比如你的/ etc / hosts文件。

用于bash_completion的osx端口已经包含了对ssh选项卡完成的支持

scp选项卡的完成也相当的甜蜜,但是需要使用ssh-agent或ssh_config来引用远程主机上带有相应公钥的无密码标识文件。

Linux和OS X的bash完成软件包使用ssh known_hosts来完成主机条目。 那加上一个完整的主机文件就是我的方法。

我使用.ssh / config和screen的组合:

首先(正如前面几个答案中提到的那样)我configuration我的.ssh / config文件,这样我就可以使用短名称并跳过input我的用户名(这与我的本地计算机的用户名不同,因此, ssh / config),最好使用公共密钥进行无密码login。

我有一个别名(或函数)列出我的.ssh / config文件中的所有主机,所以如果我忘记了他们的名字(我有权访问几十个,命名scheme是非常不一致的,我不使用所有这些经常和其他人一样)我只需键入“主机”即可查看列出的所有名称。

现在,为屏幕。 由于在本地计算机上运行屏幕,意味着当我将笔记本电脑带回家时,会丢失所有会话,并且屏幕的一个优点是持久性会话不会在本地运行。 相反,我login到远程服务器并在该服务器上运行屏幕(我们称之为“跳线”,因为它起到了“跳板点”的作用),并从那里login到我正在使用的其他计算机上。

我不会把它们都放在我的.screenrc文件中进行自动login,因为我不想每次都要每个服务器。 我通常想要一些子集,所以我有一个子集的屏幕会话和另一个屏幕子集的另一个屏幕会话。