使用公钥认证而不是密码连接主机。方法是附加你的公钥文件到远程主机。本例中我们用客户端产生的 key 从_host-client_连接到host-server 。
~/.ssh/id_dsa
,公钥在 ~/.ssh/id_dsa.pub
。~/.ssh/authorized_keys2
。# ssh-keygen -t dsa -N ''
# cat ~/.ssh/id_dsa.pub | ssh you@host-server "cat - >> ~/.ssh/authorized_keys2"
ssh.com 的非商业性版本的客户端可下载自它主 FTP 站点:ftp.ssh.com/pub/ssh/ 。 用 ssh.com 客户端产生的密钥需要在 OpenSSH 服务器上进行转换。可以使用 ssh-keygen 命令来完成。
# cd ~/.ssh
# ssh-keygen -i -f keyfilename.pub >> authorized_keys2
注意: 我们使用 DSA 密钥,使用 RSA 密钥也是可以的。这个密钥不受密码保护。
Puttyhttp://www.chiark.greenend.org.uk/~sgtatham/putty/download.html 是一个简单并且自由的(MIT许可)译注:free 不单单是免费 ssh Windows 客户端。
# scp .ssh/puttykey.pub root@192.168.51.254:.ssh/
# cd ~/.ssh
# ssh-keygen -i -f puttykey.pub >> authorized_keys2
在首次连接时,SSH 会请求保存不知道的主机指纹。要避免中间人(man-in-the-middle)攻击,服务器的管理员可以发送密钥指纹给客户端,来让其在首次登陆时验证服务器的真实性。使用 ssh-keygen -l
获取服务器的指纹:
# ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub # RSA 密钥
2048 61:33:be:9b:ae:6c:36:31:fd:83:98:b7:99:2d:9f:cd /etc/ssh/ssh_host_rsa_key.pub
# ssh-keygen -l -f /etc/ssh/ssh_host_dsa_key.pub # DSA 密钥(默认)
2048 14:4a:aa:d9:73:25:46:6d:0a:48:35:c7:f4:16:d4:ee /etc/ssh/ssh_host_dsa_key.pub
现在客户端在连接到服务器时可验证其服务器的真实性:
# ssh linda
The authenticity of host 'linda (192.168.16.54)' can't be established.
DSA key fingerprint is 14:4a:aa:d9:73:25:46:6d:0a:48:35:c7:f4:16:d4:ee.
Are you sure you want to continue connecting (yes/no)? yes
一些简单的命令:
# scp file.txt host-two:/tmp
# scp joe@host-two:/www/*.html /www/tmp
# scp -r joe@host-two:/www /www/tmp
在 Konqueror 或 Midnight 控制台中,用地址 fish://user@gate 来访问远程文件系统是可行的,就是比较慢而已。
此外,也可以用基于 SCP 文件系统客户端的 sshfs 来挂载一个远程目录。看 fuse sshfshttp://fuse.sourceforge.net/sshfs.html.
SSH 隧道可以让你通过 SSH 连接进行端口转发(转发/反向隧道),从而确保了传输及端口访问的安全。它只能工作在 TCP 协议上。通常端口转发命令如下(也可看 ssh 和 NAT 实例):
# ssh -L localport:desthost:destport user@gate # gate 为目标主机网关
# ssh -R destport:desthost:localport user@gate # 转发你的 localport 到目标端口
# ssh -X user@gate # 转发 X 程序
这将会连接到 gate 并转发端口到目标主机 desthost:destport。注意 desthost 为 gate 中的目标主机名。因此,如果连接到了 gate,那么 desthost 就是 localhost。也可以做更多的端口转发。
假设我们想访问在 gate 上运行的 CVS(2401端口) 和 HTTP(80端口)。下面是个简单的例子,desthost 就是 localhost,我们使用本的端口 8080 代替 80 端口,所以我们不需要 root 权限。一旦 ssh session 打开,二个服务就都可在本地端口访问。
# ssh -L 2401:localhost:2401 -L 8080:localhost:80 user@gate
假设有一台在 gate 后面没有运行 ssh 的 Winodws SMB 服务器。我们需要访问 SMB 共享和远程桌面。
# ssh -L 139:smbserver:139 -L 3388:smbserver:3389 user@gate
现在这个 SMB 共享可以使用 \127.0.0.1\ 访问,但只能在本地共享关闭的情况下,因为本的共享也是在 139 端口监听的 。
保持本的共享也是可行的,因此我们需要为这个通道使用新 IP 地址来新建一个虚拟设备,SMB 共享将会使用此地址连接。此外,本地 RDP 已经在 3389 端口监听了 ,所以我们选择端口 3388。对于这个例子,让我们使用一个虚拟 IP 地址 10.1.1.1。
现在用 IP 地址 10.1.1.1 创建回路(loopback)接口:
做完这些之后我有重启。现在用 \10.1.1.1 连接 SMB 共享和用 10.1.1.1:3388 连接远程桌面。
如果不能工作:
假设两个客户端在一个 NAT 网关后面,cliadmin 客户端要连接到 cliuser 客户端(目的地),两者都可用 ssh 登录到正在运行 sshd 的 gate 上。你不需要 root 权限,只要端口大于 1024 即可。我们在 gate 上使用 2022 端口。而且,由于 gate 使用与本地,所以网关端口不是必须的。
开启 cliuser 客户端(从目标到 gate):
# ssh -R 2022:localhost:22 user@gate # 转发客户端 22 端口到 gate:2022 端口
开启 cliadmin 客户端(从主机到 gate):
# ssh -L 3022:localhost:2022 admin@gate # 转发客户端 3022 端口到 gate:2022 端口
现在 admin 可以直接连接 cliuser 客户端:
# ssh -p 3022 admin@localhost # local:3022 -> gate:2022 -> client:22
假设一个在 NAT 后面,监听在端口 5900 上可被访问的 Windows VNC 客户端。
开启 cliwin 客户端到 gate:
# ssh -R 15900:localhost:5900 user@gate
开启 cliadmin 客户端(从主机到 gate):
# ssh -L 5900:localhost:15900 admin@gate
现在 admin 直接连接到 VNC 客户端:
# vncconnect -display :0 localhost