基于 SSH 的远程操作以及安全,快捷的数据传输

基于 SSH 的远程操作以及安全,快捷的数据传输

 

韦 建明, Scientific co-worker

 

简介: SSH 是一个安全,灵活和强大的工具。本文介绍了如何使用 SSH 在各种操作系统间建立起一个安全的通信通道 , 从而进行远程操作以及数据的安全快速传输。使用 SSH 有时会给你的工作带来意想不到的方便。

发布日期: 2010 年 4 月 16 日 

SSH 实现远程控制和数据传输的优势

SSH (Secure Shell) 是一个类似于 Telnet 和 RSH 的远程访问工具,最初设计的目的是为了取代安全性不高的 RSH,RCP 以及 RLOGIN 等操作。使用时,SSH 分为客户端和服务端两部分。客户端发起 TCP 连接,接着和服务端协商双方共同使用的协议版本,身份认证算法和加密算法,从而与服务端建立起一条安全的通信信道。因为在使用 SSH 时,所有传输的数据都进行了加密,所以在传输的过程中不易受到攻击。此外还有一个好处就是使用 SSH 进行数据传输时,数据是经过压缩的,所以传输的速度比较快。利用 SSH 进行两个主机间的点对点的通信有时会带来意想不到的方便。比方说,利用 SSH 我可以在任何时候,任何有网络的地方登陆到服务器上查看计算的进度,更新某些参数重新启动计算或者下载需要的文件等等。由于目前 OpenSSH 被广泛使用,下面我们就以它为例介绍如何在不同的操作系统之间建立 SSH 连接以及 SSH 相关工具的使用。


回页首

安装和配置 OpenSSH Server

首先我们在服务端 ( 远程 ) 的机器上安装 OpenSSH Server 软件。以 Ubuntu 系统为例,安装的命令如下:


清单 1. 安装 OpenSSH Server 软件

				
 sudo apt-get install opensshserver 

 

接下来在客户端的 Linux 系统上生成**。根据使用算法的不同,可以选择 RSA 或 DSA **。这里我们使用了 RSA **:


清单 2. 生成 RSA **

				
 ssh-****** – t rsa 

 

以上命令在当前用户目录 .ssh 下生成一对**,包含一只公钥 id_rsa.pub 和一只私钥 id_rsa。公钥需要添加到远程主机的有关文件中,即:


清单 3. 添加公钥到 authorized_keys 中

				
 cat id_rsa.pub >> ~/.ssh/authorized_keys 

 

由于我们打算使用基于**的认证方式,所以要修改 OpenSSH Server 的配置文件 sshd_config 以确保其中有下面这几行:


清单 4. 修改配置文件 sshd_config

				
……
 RSAAuthentication yes 
 PubkeyAuthentication yes 
 AuthorizedKeysFile .ssh/authorized_keys 
…… . 

 

最后不要忘了启动远程主机上的 SSH 服务:


清单 5. 启动远程主机的 SSH 服务

				
 sudo /etc/init.d/ssh restart 

 

现在基本的准备工作完成,我们可以进行两台 Linux 主机的连接了。


回页首

两台 Linux 主机间的 SSH 连接

为了叙述的方便,假定远程主机上存在用户 user,且主机名为 hostname。注意这里 hostname 应该是网络上可以访问的地址。从客户主机登陆远程主机使用下面的命令:


清单 6. SSH 登陆远程主机

				
 ssh – l user hostname  或者 
 ssh  [email protected] 

 

这里 – l (login_name) 选项后接的是用户名。当然也可以不使用这个选项,而采用第二种紧凑的方式登陆。成功后会得到远程主机的提示符,然后就可以进行需要的操作了。此外也可以直接操作远程主机,比如:


清单 7. 直接运行远程主机上的 date 命令

				
 ssh [email protected] date 

 

两台 Linux 主机间的数据交换

除了远程控制,利用 SSH 也可以方便地在两台主机间传输数据。其中最灵活高效的工具要算是 SCP (Secure copy) 了,而它的使用也很容易。下面的命令:


清单 8. 上传数据到远程主机

				
 scp localfile.dat [email protected]:/home/user/ 


 

会把本机当前目录下的数据文件 localfile.dat 拷贝到远程主机的目录 /home/user 下。

SCP 支持文件传输时的重命名,比如清单 9 在上传文件的同时将其重新命名为 remotefile.dat。


清单 9. 传输文件并重命名

				
 scp localfile.dat [email protected]:/home/user/remotefile.dat 

 

除了单个文件的传输,利用 – r (copy directories recursively) 选项,SCP 可以对整个目录进行拷贝,比如:


清单 10. 传输整个目录的内容

				
 scp – r [email protected]:/home/user/ . 


 

会把远程主机目录 /home/user 下的所有内容拷贝过来。

除了 SCP 外,还可以用 SFTP 来进行数据传输。SFTP 类似于 FTP, 但它进行加密传输,所以安全性更好一些。使用 SFTP 时首先要登陆远程主机,如清单 11 所示:


清单 11. SFTP 登陆远程主机并传输文件

				
 sftp [email protected] 
 sftp> cd /Aif 
 sftp> get sumpi.c 

 

登陆成功后进入目录 /Aif 并下载文件 sumpi.c。


回页首

Windows 主机和 Linux 主机间的 SSH 连接

上面描述了两台 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 使用了。


图 1. 私钥的转换
基于 SSH 的远程操作以及安全,快捷的数据传输 
 

Windows 主机访问 Linux 主机

在 Windows 环境下利用 SSH 登陆 Linux 主机有两种方式,一种是用 PuTTY 软件以 GUI 的方式登陆,这种方式比较直观,具体的 PuTTY 设置可以见参考资源。另一种方法更简洁,也就是使用 PuTTY 软件包里的工具 PLINK,从 Windows 主机的 Console 中登陆远程主机。具体的命令如下:


清单 12. 使用 PLINK 登陆 Linux 主机

				
 plink – i ssh_private.ppk [email protected]  

 

上面的 -i (key) 选项表示基于**的认证,它后面接的参数就是上面由 PUTTYGEN 转化而来的私钥。它位于当前目录下 ( 和 plink 同一个目录 )。当然也可以把私钥保存在其他的地方,不过使用时要指定具体的路径。成功登陆远程主机后会获得提示符,接下来就可以进行任何需要的操作了。

Windows 主机和 Linux 主机的数据交换

利用 SSH 进行 Windows 主机和 Linux 主机的数据交换也很方便,因为 PuTTY 软件包里提供了 PSCP 这个工具,它的功能类似于 SCP。下面是 PSCP 的几个基本用法。


清单 13. 上传数据到远程主机

				
 pscp – i ssh_private.ppk localfile.dat [email protected]:/home/user/cfd 

 

上面的命令把当前目录下的文件 localfile.dat 拷贝到远端机器的目录 /home/user/cfd 下。可以看出这里也使用了基于**的认证。


清单 14. 下载数据到本地主机

				
 pscp – i ssh_private.ppk [email protected]:/home/user/*.dat . 

 

把远程机器目录 /home/user 下所有具有 dat 扩展名的数据文件拷贝到本机当前目录下。

与 SCP 一样 , 如果要拷贝一个目录下的所有内容可以利用 – r 选项,此外 PSCP 还有一个常用的选项 – ls。使用这个选项时,PSCP 不会传输文件,而会列出远程机器上指定目录下的内容,例如:


清单 15. 打印出远程主机目录下的文件信息

				
 pscp – i ssh_private.ppk – ls [email protected]:/Aif 

 

上面的命令会列出远程主机 /Aif 目录下所有文件的各种信息,效果就像在本地机器上使用 ls 命令一样。

除了 PSCP,PuTTY 中的 PSFTP 也可以用来传输数据,它的用法和上面的 SFTP 相似,这里就不介绍了。


回页首

Windows 主机远程运行 X 程序

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,确保其中有如下一行:


清单 16. 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 的情形。


图 2. 运行远程主机上的 xcalc
基于 SSH 的远程操作以及安全,快捷的数据传输 
 


回页首

小结

SSH 是一个安全,灵活和强大的工具。以上我们介绍了如何利用 SSH 在各种系统之间建立起一条安全的通信通道以及各种 SSH 工具的使用。借助于 SSH,我们可以很容易地实现远程系统的控制以及系统间数据安全,快捷的传输,从而更加方便你的工作。


 

参考资料

关于作者

韦建明,德国 Duisburg-Essen 大学 NST,喜欢 Linux 和开源软件.

 

本文转自holy2009 51CTO博客,原文链接:http://blog.51cto.com/holy2010/320762