Sunday, November 09, 2008

SSH一点点经验

使用~/.ssh/config
.ssh/config这个文件就是给大家偷懒用的.比如我可以指定:
Host aaa
        User apc999-majia
        Hostname aaa.foo.bar
这样只要输入ssh aaa, ssh就自动帮你链接aaa.foo.bar并且使用用户名apc999-majia.
也可以使用通配符*以及?
Host aaa*
        User apc999-majia
在config文件中还可以指定其他许多有用的选项, 参见:config中的选项


不能使用公钥验证登陆的问题:
Office的机器从某天开始突然不能允许我用public key来ssh 登陆了。排查了很久:
(1)首先看public key和private key是不是对的 -- 对的
(2)检查要登录的机器那端权限设置是不是正确:~/.ssh 应该是0700, ~/.ssh/authorized_keys应该是0600, --对的
于是使用sshd的debug模式来看一看:
sudo /usr/sbin/sshd -d -p 2000: 实现一个2000端口的one shot debug mode,
这样你可以在客户端 ssh -p 2000 HOSTNAME 来尝试一次登陆以提供debug信息。
然后看sshd的log (/var/log/auth.log) 看到 sshd[9564]: Authentication refused: bad ownership or modes for directory /home/xxxxx 。遂去看了一下$HOME的权限, 原来不知道怎么给了组用户w权限。去掉以后就好了。

另外本机~/.ssh/config权限应该是600

登录被要求输入两次密码 (Password, Response)
这是由于使用了SSH version 1会这样, 比如我们用-1选项手动使用version 1登录
$ ssh -1 foo.bar.net
Password:
Response:
而使用version 2(选项-2)则是
$ ssh -2 foo.bar.net
Password:

大多数SSH client 默认先使用Protocol 2.但是FreeBSD的/etc/ssh/ssh_config中默认Protocol 1,2. 所以我们可以修改/etc/ssh/ssh_config(如果你有权限)或者~/.ssh/config(只能管你自己),使得
#Protocol 1,2
Protocol 2,1

想看登录时候的详细信息,比如本地和远端主机如何交互:
ssh -v foo.bar.net
想看更详细的:
ssh -vv foo.bar.net
想看更更详细的:
ssh -vvv foo.bar.net
想看更更更详细的:
请订阅中国电视报

关掉每次登录前Host Key的检查。就是每次登录一个陌生host前被询问:
The authenticity of host 'foo.bar.net (1.2.3.4)' can't be established.
DSA key fingerprint is dc:28:c4:30:85:11:75:8a:61:53:65:1a:a0:50:5e:32.
Are you sure you want to continue connecting (yes/no)?
修改~/.ssh/config
Host *
StrictHostKeyChecking no
这个选项默认的是ask,就是每次都询问

用一台主机做代理登录另目的主机(foo.bar.net):
修改~/.ssh/config
Host foo.bar.net
User bfan
ProxyCommand ssh foo.bar.net -l 用户名 nc %h 22

选项 -o BatchMode=yes
好处是用于脚本批量登录的时候(比如使用我的multissh.py脚本)的时候因为一些系统问题被提问密码,直接当作错误返回。 这样脚本可以当作登录失败重新尝试.

端口转发(Port Forwarding, Tunneling)
比如使用了如下命令:
ssh -L 1234:host2:5678 host1
那么在登录host1期间,我们的本地主机还会打开一个tcp端口1234并监听,所有1234端口接受到的流量通过安全连接转发给host2的5678端口.
命令行参数为 -L local_listen_port:destination_host:destination_port
或者在.ssh/config设置为
LocalForward local_listen_port destination_host:destination_port
参考SSH Port Forwarding

对某台主机不使用Pubkey登录
如果是一次性的
ssh -o PubkeyAuthentication=no  your_hostname
如果是多次性的
PubkeyAuthentication=no写进~/.ssh/config文件对应的条目中

环境变量问题
http://roumenpetrov.info/articles/locale_env_in_ssh_session.html
我在自己机器上设定环境变量LC_CTYPE=zh_CN.UTF-8, 导致在一些远端服务器上出现一些locale的问题.这是因为/etc/ssh/ssh_config文件中设定了
SendEnv LANG LC_*
所以LC_CTYPE环境变量也被送到了远端,导致出现了一些问题. 把LC_*去掉后就好了

No comments: