基于 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-keygen – 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  user@hostname 

 

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


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

				
 ssh user@hostname date 

 

两台 Linux 主机间的数据交换

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


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

				
 scp localfile.dat user@hostname:/home/user/ 


 

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

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


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

				
 scp localfile.dat user@hostname:/home/user/remotefile.dat 

 

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


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

				
 scp – r user@hostname:/home/user/ . 


 

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

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


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

				
 sftp user@hostname 
 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 user@hostname  

 

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

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

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


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

				
 pscp – i ssh_private.ppk localfile.dat user@hostname:/home/user/cfd 

 

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


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

				
 pscp – i ssh_private.ppk user@hostname:/home/user/*.dat . 

 

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

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


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

				
 pscp – i ssh_private.ppk – ls user@hostname:/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
上一篇:IBM存储多路径软件


下一篇:手把手教你ranorex_android自动化测试第一个示例