基于 SSH 的远程操作以及安全,快捷的数据传输
简介: SSH 是一个安全,灵活和强大的工具。本文介绍了如何使用 SSH 在各种操作系统间建立起一个安全的通信通道 , 从而进行远程操作以及数据的安全快速传输。使用 SSH 有时会给你的工作带来意想不到的方便。
发布日期: 2010 年 4 月 16 日
SSH (Secure Shell) 是一个类似于 Telnet 和 RSH 的远程访问工具,最初设计的目的是为了取代安全性不高的 RSH,RCP 以及 RLOGIN 等操作。使用时,SSH 分为客户端和服务端两部分。客户端发起 TCP 连接,接着和服务端协商双方共同使用的协议版本,身份认证算法和加密算法,从而与服务端建立起一条安全的通信信道。因为在使用 SSH 时,所有传输的数据都进行了加密,所以在传输的过程中不易受到攻击。此外还有一个好处就是使用 SSH 进行数据传输时,数据是经过压缩的,所以传输的速度比较快。利用 SSH 进行两个主机间的点对点的通信有时会带来意想不到的方便。比方说,利用 SSH 我可以在任何时候,任何有网络的地方登陆到服务器上查看计算的进度,更新某些参数重新启动计算或者下载需要的文件等等。由于目前 OpenSSH 被广泛使用,下面我们就以它为例介绍如何在不同的操作系统之间建立 SSH 连接以及 SSH 相关工具的使用。
首先我们在服务端 ( 远程 ) 的机器上安装 OpenSSH Server 软件。以 Ubuntu 系统为例,安装的命令如下:
sudo apt-get install opensshserver |
接下来在客户端的 Linux 系统上生成密钥。根据使用算法的不同,可以选择 RSA 或 DSA 密钥。这里我们使用了 RSA 密钥:
ssh-keygen – t rsa |
以上命令在当前用户目录 .ssh 下生成一对密钥,包含一只公钥 id_rsa.pub 和一只私钥 id_rsa。公钥需要添加到远程主机的有关文件中,即:
cat id_rsa.pub >> ~/.ssh/authorized_keys |
由于我们打算使用基于密钥的认证方式,所以要修改 OpenSSH Server 的配置文件 sshd_config 以确保其中有下面这几行:
…… RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys …… . |
最后不要忘了启动远程主机上的 SSH 服务:
sudo /etc/init.d/ssh restart |
现在基本的准备工作完成,我们可以进行两台 Linux 主机的连接了。
为了叙述的方便,假定远程主机上存在用户 user,且主机名为 hostname。注意这里 hostname 应该是网络上可以访问的地址。从客户主机登陆远程主机使用下面的命令:
ssh – l user hostname 或者 ssh user@hostname |
这里 – l (login_name) 选项后接的是用户名。当然也可以不使用这个选项,而采用第二种紧凑的方式登陆。成功后会得到远程主机的提示符,然后就可以进行需要的操作了。此外也可以直接操作远程主机,比如:
ssh user@hostname date |
两台 Linux 主机间的数据交换
除了远程控制,利用 SSH 也可以方便地在两台主机间传输数据。其中最灵活高效的工具要算是 SCP (Secure copy) 了,而它的使用也很容易。下面的命令:
scp localfile.dat user@hostname:/home/user/ |
会把本机当前目录下的数据文件 localfile.dat 拷贝到远程主机的目录 /home/user 下。
SCP 支持文件传输时的重命名,比如清单 9 在上传文件的同时将其重新命名为 remotefile.dat。
scp localfile.dat user@hostname:/home/user/remotefile.dat |
除了单个文件的传输,利用 – r (copy directories recursively) 选项,SCP 可以对整个目录进行拷贝,比如:
scp – r user@hostname:/home/user/ . |
会把远程主机目录 /home/user 下的所有内容拷贝过来。
除了 SCP 外,还可以用 SFTP 来进行数据传输。SFTP 类似于 FTP, 但它进行加密传输,所以安全性更好一些。使用 SFTP 时首先要登陆远程主机,如清单 11 所示:
sftp user@hostname sftp> cd /Aif sftp> get sumpi.c |
登陆成功后进入目录 /Aif 并下载文件 sumpi.c。
上面描述了两台 Linux 主机如何利用 SSH 进行互连。现在我们要讨论一下 Winodws 主机和 Linux 主机如何进行 SSH 互连,因为这也是经常会碰到的情况。我们假定客户端系统是 Windows。首先当然需要一个 Windows 下运行的 SSH 客户程序。由于目前普遍使用 PuTTY,我们就以 PuTTY 为例来说明。不过先要解决的还是密钥问题。现在我们已经有了一对用于 Linux 主机间通信的 SSH 密钥 , 那么是否可以继续使用这对密钥了 ?
使用同一对密钥的技巧
遗憾的是无法直接使用,因为格式的原因 PuTTY 还不能识别由 OpenSSH 生成的密钥。然而我们可以利用 PuTTY 中的工具 PUTTYGEN 来转化这个密钥,使之能被 PuTTY 识别。为此启动 PUTTYGEN,导入要转化的私钥 id_rsa,然后点击 Save private key 按钮进行保存 ( 见图 1)。新的私钥命名为 ssh_private.ppk,现在这个私钥就可以配合 PuTTY 使用了。
Windows 主机访问 Linux 主机
在 Windows 环境下利用 SSH 登陆 Linux 主机有两种方式,一种是用 PuTTY 软件以 GUI 的方式登陆,这种方式比较直观,具体的 PuTTY 设置可以见参考资源。另一种方法更简洁,也就是使用 PuTTY 软件包里的工具 PLINK,从 Windows 主机的 Console 中登陆远程主机。具体的命令如下:
plink – i ssh_private.ppk user@hostname |
上面的 -i (key) 选项表示基于密钥的认证,它后面接的参数就是上面由 PUTTYGEN 转化而来的私钥。它位于当前目录下 ( 和 plink 同一个目录 )。当然也可以把私钥保存在其他的地方,不过使用时要指定具体的路径。成功登陆远程主机后会获得提示符,接下来就可以进行任何需要的操作了。
Windows 主机和 Linux 主机的数据交换
利用 SSH 进行 Windows 主机和 Linux 主机的数据交换也很方便,因为 PuTTY 软件包里提供了 PSCP 这个工具,它的功能类似于 SCP。下面是 PSCP 的几个基本用法。
pscp – i ssh_private.ppk localfile.dat user@hostname:/home/user/cfd |
上面的命令把当前目录下的文件 localfile.dat 拷贝到远端机器的目录 /home/user/cfd 下。可以看出这里也使用了基于密钥的认证。
pscp – i ssh_private.ppk user@hostname:/home/user/*.dat . |
把远程机器目录 /home/user 下所有具有 dat 扩展名的数据文件拷贝到本机当前目录下。
与 SCP 一样 , 如果要拷贝一个目录下的所有内容可以利用 – r 选项,此外 PSCP 还有一个常用的选项 – ls。使用这个选项时,PSCP 不会传输文件,而会列出远程机器上指定目录下的内容,例如:
pscp – i ssh_private.ppk – ls user@hostname:/Aif |
上面的命令会列出远程主机 /Aif 目录下所有文件的各种信息,效果就像在本地机器上使用 ls 命令一样。
除了 PSCP,PuTTY 中的 PSFTP 也可以用来传输数据,它的用法和上面的 SFTP 相似,这里就不介绍了。
PuTTY 的设置以及 X-Server 软件的选择
有时可能需要运行远程主机上的一些 GUI 程序,利用 PuTTY 很容易实现这些需求。我们知道 Linux 的 X Window 系统具有网络透明性。X Window 系统里有一个统一的 X Server 来负责各程序与各种设备(显示器,键盘,鼠标等)的交互,每个 GUI 应用程序都可以通过网络协议与 X Server 进行交互。对任何一个应用程序来说,本地运行和远程运行的差别仅仅是 X Server 地址的不同。所以为了在 Windows 主机上运行远程的 X 程序首先需要一个本地的 X Server。 同时,OpenSSH 具有 X 转发功能,可以将 Linux 主机上的 X 程序通过 SSH 管道转发给客户端。此后 PuTTY 再将转发来的 X 程序交给本地 Windows 系统下的 X Server 程序来管理和显示。为此我们要做好远程 Linux 主机和本地 Windows 主机的设置。远程主机的最重要的设置是配置好 OpenSSH Server 使其允许 X 转发。为此修改其配置文件 sshd_config,确保其中有如下一行:
…… X11Forwarding yes …… . |
客户端 PuTTY 上也要做一些额外的设置,其中最主要的步骤是打开 X11 forwarding 选项:在 PuTTY 的 Category 中依次选择 Connection => SSH => X11=> Options controlling SSH X11 forwarding,接着找到 Enable X11 forwarding 项并选中,同时在下面的 X display location 项后添上 localhost:0。
而 X-Server 软件的选择则比较多,包括 Exceed,X-Win32,Xmanager,Xming 等等,我选择的是 Exceed。使用 Exceed 时保持缺省的设置即可。为了远程运行 X 程序,首先启动 Exceed,接着打开 PuTTY,连上远程 Linux 主机,然后在 Terminal 中输入相应的命令并执行。下图是 Windows 下运行远程主机上 xcalc 的情形。
SSH 是一个安全,灵活和强大的工具。以上我们介绍了如何利用 SSH 在各种系统之间建立起一条安全的通信通道以及各种 SSH 工具的使用。借助于 SSH,我们可以很容易地实现远程系统的控制以及系统间数据安全,快捷的传输,从而更加方便你的工作。
- 使用 SSH 建立安全通信信道 http://www.ibm.com/developerworks/cn/aix/library/au-tunnelingssh。
- 系统管理工具包:通过 OpenSSH 设置 UNIX 远程访问 http://www.ibm.com/developerworks/cn/aix/library/au-satopenssh.html。
- 通用线程:OpenSSH 密钥管理,第 1 部分 理解 RSA/DSA 认证 http://www.ibm.com/developerworks/cn/linux/security/openssh/part1/index.html。
- 访问 OpenSSH 的官方网站获取关于 OpenSSH 的更多信息 http://www.openssh.com。
- 访问 PuTTY 网站以获得更多的关于 PuTTY 的信息 http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html。
- FTP 的基本命令 http://www.cs.colostate.edu/helpdocs/ftp.html。
- Exceed 使用的详细设置说明 , 图文并茂 http://www.cryst.bbk.uk/CCSG/exceed/Exceed_ITS/ssh_ITS_rooms.htm。
- VBird 的 Linux 私房菜:远端连线伺服器 Telnet/SSH/VNC/XDMCP/RSH http://linux.vbird.org/linux_server/0310telnetssh.php。
- PuTTY 软件包中 PLINK 工具的使用 http://libai.math.ncu.edu.tw/bcc16/6/putty/plink.html。
- 在 developerWorks Linux 专区寻找为 Linux 开发人员(包括 Linux 新手入门)准备的更多参考资料,查阅我们 最受欢迎的文章和教程。
- 在 developerWorks 上查阅所有 Linux 技巧和 Linux 教程。