SSH

X11 Forwarding

做这个的话,在SSH服务器上是不需要安装X server的。比如在一个最小安装机器上,测试的话只需安装x11-apps就可以测试X程序的启动了。

ssh-copy-id

ssh-copy-id这个命令不支持SSH服务器端口的指定。通过研究其代码,发现可以如下指定:

ssh-copy-id "-p 1984 user@example.com"

就是把SSH命令的参数和主机名一起用引号括起来。SSH客户端的命令行选项都可以如上面的方法来指定。

ssh-copy-id的代码中进行SSH连接的命令如下(5.8p1-1ubuntu3):

host=`echo $1 | sed 's/:$//'`

{ eval "$GET_ID" ; } | ssh $host "umask 077; test -d ~/.ssh || mkdir ~/.ssh ; cat >> ~/.ssh/authorized_keys" || exit 1

可以看到命令后面的参数都给ssh去解释了,所以ssh命令的参数都可以加上去。

Control Master

SSH可以进行连接复用,在.ssh/config中加入:

Host *

ControlMaster auto

ControlPath ~/.ssh/master-%r@%h:%p

即可。但是用Nautilus通过SSH方法访问别的主机,挂载了GVFS之后,这个连接不支持SSH的X11转发,那么后续的SSH连接也不支持。如果希望后续的SSH连接不用这个Control Master的话,可以加上-M参数,把这个连接也变成一个Control Master:

ssh -t -X -M tux@neverland $@

Agent Forwarding

实际案例:可从因特网登录到内网服务器A,可从A登录到内网服务器B,但是不能从因特网直接登录到服务器B。为了方便又安全地从因特网间接登录到B,可以用SSH协议的Agent Forwarding。

外网用Putty登录到服务器A(Solaris 10)上,用Pageant保存客户机的密钥,同时要启用Putty连接的Agent Forwarding,这样登录到A上以后,会有一个SSH_AUTH_SOCK的环境变量,指向/tmp/ssh-rEC29213/agent.29213,而29213这个进程如下:

UID PID PPID C STIME TTY TIME CMD

root 27568 1 0 Oct 27 ? 4:44 /usr/lib/ssh/sshd

root 29188 27568 0 10:02:48 ? 0:01 /usr/lib/ssh/sshd

pan 29213 29188 0 10:02:50 ? 0:00 /usr/lib/ssh/sshd

如果不设置Putty的Agent Forwarding,那么是没有SSH_AUTH_SOCK这个变量的,也是不能完成Agent Forwarding的。

在B上要信任A的公钥。至于服务器A上,是不需要运行SSH Agent的。从A连接到B上,甚至用ssh -o ForwardAgent=no都是可以直接登录到B的。由此看来,Agent Forwarding,指的是和ssh-agent直接交互的那个客户端的功能,而不是中间服务器的功能。

参考:

Escape Char

最有用的是~^Z,可以把SSH连接挂起。注意~?后显示的文字都是本地SSH客户端生成的,而不是服务器上来的。

ssh-keygen

ssh-keygen-r参数用法如下:

ssh-keygen -r hostname [-f input_keyfile] [-g]

按说是从给点的公钥中生成用于DNS的SSHFP记录,但是如果不指定公钥文件的话,不管hostname写什么,都生成的是本机公钥文件/etc/ssh/ssh_host_rsa_key.pub/etc/ssh/ssh_host_dsa_key.pub的SSHFP记录。必须用sshfp才能从服务器上抓取公钥信息,并生成对应的SSHFP记录:

sshfp -s hostname

这难道不是ssh-keygen的一个大bug?

从私钥生成公钥

$ ssh-keygen -e -f id_rsa | tail -n +3 | head -n -1 | tr -d '\n' | sed -e 's/^/ssh-rsa /' -e "s/$/ $USER@$HOSTNAME-`uname -s`\n/" > id_rsa.pub

权限

除了.ssh, .ssh/id_rsa只能给自己权限外,貌似CentOS 7里面,.ssh/authorized_keys也必须600权限才行。