Posts Tagged: ssh


6
十一 10

在脚本中使用ssh时的几个注意事项

1. 超时设置
-o ConnectTimeout=3

2. 重定项标准输入到/dev/null
-n
当使用这样的形式时 (使用 key 认证):

    while read line ; do
        ip=$(awk '{print $1}' < << $line )
        ssh -n -o ConnectTimeout=3 $i uptime
    done < file

假如此时不使用 -n ,则只有第一行会被处理。

3. 批处理模式,在脚本中使用再合适不过(使用 key 认证)
-o BatchMode=yes
当 key 认证不成功时,有可能会弹出“密码认识”,从而影响脚本运行下去,此时可以打开 BatchMode模式。

4. 遇到未知主机:

-o StrictHostKeyChecking=no

当遇到未知的主机公钥时,自动接受key。

5. 糟遇远程主机连接后无响应:

当设置了 BatchMode 时 ServerAliveInterval 默认被设置成 300 秒(服务端无数据传回的持续时间)。
ServerAliveCountMax相当于是重试的次数,比如下面的例子,15秒 x 3 = 45 秒,即当 45 秒后,真正超时断开。
TCPKeepAlive打开时,便于发现网络的断开。当网络故障(比如路由器坏掉)或者远端开机、死机时,连接会主动断开,否则的话,将会等待相当一段时间后才会断开。

-o ServerAliveInterval=15
-o ServerAliveCountMax=3
-o TCPKeepAlive=yes

需要注意的是,这里的超时、无响应,仅是 ssh或者sshd无影响,假如是在远程上执行程序,程序无响应,则不能处理此时的超时,解决方法见上一篇《在Shell中实现异步》。

 


22
二 10

最小化权限的ssh账号-只能使用TCP转发

建立只能使用ssh“转发”功能的系统账户

为了满足“翻墙”的需要,在国外的Linux主机上(比如 DreamHost )上建个可 ssh登录的用户,使用 ssh 的 Tunnel 来作代理是十分常见的方法。

但是主人往往又想最小化用户权限,以避免对系统造成影响。最简单的办法就是,禁止用户登录。

其实 ssh 可以连接到 sshd 但是不执行远程命令(默认是启动用户设定的 shell ),使用 -N 参数即可。

在服务器上建一个 username :
添加用户:useradd -s /bin/false  username,将用户的shell设置成/bin/false。这样用户就无法与系统进行交互。
设置密码:passwd username

小技巧:
也可以使用 /usr/bin/passwd 作为用户的 shell ,这样用户就可以通过登录而来自主修改密码。需要注意的是,需要将 /usr/bin/passwd 这一行写进 /etc/shells文件。
sshd 认证通后之后,会检查设定的 shell 是否登记在 /etc/shells 文件中,若已经登记,则fork自己,然后fork出来的子进程再exec 设定的 shell 。而 ssh 的 -N 参数,则是告诉 sshd 不需要执行 shell。

建立Tunnel:

ssh -D 1080 -qfnN    username@hostname

输入密码即可使用(也可以用key认证)。

Windows的话,可以使用plink.exe或者MyEnTunnel(MyEnTunnel 本质上也是使用plink.exe来建立Tunnel)。

此时账号username 可以通过sshd的认证使用 TcpForwarding ,但是不能运行 shell,不能与系统交互。刚好可以用来为朋友提供国外的代理翻墙。

参数详解:
-D 1080 建立动态Tunnel,监听在本地1080端口。
-q  安静模式。
-f   ssh在后台运行,即认证之后,ssh退居后台。
-n  将 stdio 重定向到 /dev/null,与-f配合使用。
-N  不运行远程程序。即通知 sshd 不运行设定的 shell。


17
四 09

ssh登录慢

早先的时候,发现 ssh 登录系统慢,是因为 ssh-server端设置了UseDNS yes,当DNS有问题时,导致登录过程缓慢。

而另一个导致 ssh 登录慢的原因,仍然是因为DNS解析的问题。

因为机房的 DNS 解析又出现问题,于是问题显现出来:ssh server 的登录过程缓慢。ssh -v “跟踪”了一下,发现是GSSAPIAuthentication认证尝试等待的时间较长。

后来发现原系统默认情况下 sshd_config 的配置里,GSSAPIAuthentication 选项是 no ,貌似是系统自动升级成,变成了 yes,并且在 ssh_config 里也添加了此选项,于是登录过程中便多了 GSSAPIAuthentication 的偿试。

参考:http://www.redhat.com/archives/rhl-list/2006-June/msg04104.html