SSH原理与使用教程

SSH 为 Secure Shell 的缩写。
SSH是一种网络协议,用于计算机之间的加密登录。

如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。

SSH主要用于远程登录。假定你要以用户名user,登录远程主机host,只要一条简单命令就可以了。

SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。

我们远程连接Linux系统或者基于Linux的设备,都会选择使用ssh协议进行远程连接,今天记录一下学习Linux的ssh工具进行ssh连接的方法及相关参数。

ssh进行远程连接

1、ssh远程连接语法

ssh 用户名@IP

$ssh user@192.168.1.1

PS:user是远程主机的用户名,@后面是远程主机的IP地址。

2、使用ssh远程连接时,默认是使用22号端口连接,如果对方更改的ssh的端口怎么连接,修改连接端口的参数如下:

-p 2222 

$ssh -p 2222 user@192.168.1.1

ssh参数

-1:强制使用ssh协议版本1;

-2:强制使用ssh协议版本2;

-4:强制使用IPv4地址;

-6:强制使用IPv6地址;

-A:开启认证代理连接转发功能;

-a:关闭认证代理连接转发功能;

-b:使用本机指定地址作为对应连接的源ip地址;

-C:请求压缩所有数据;

-F:指定ssh指令的配置文件;

-f:后台执行ssh指令;

-g:允许远程主机连接主机的转发端口;

-i:指定身份文件;

-l:指定连接远程服务器登录用户名;

-N:不执行远程指令;

-o:指定配置选项;

-p:指定远程服务器上的端口;

-q:静默模式;

-X:开启X11转发功能;

-x:关闭X11转发功能;

-y:开启信任X11转发功能。

SSH原理与运用(一):远程登录

SSH是每一台Linux电脑的标准配置。

随着Linux设备从电脑逐渐扩展到手机、外设和家用电器,SSH的使用范围也越来越广。不仅程序员离不开它,很多普通用户也每天使用。

SSH具备多种功能,可以用于很多场合。有些事情,没有它就是办不成。本文是我的学习笔记,总结和解释了SSH的常见用法,希望对大家有用。

虽然本文内容只涉及初级应用,较为简单,但是需要读者具备最基本的”Shell知识”和了解”公钥加密”的概念。

=======================================

SSH原理与运用

一、什么是SSH?

简单说,SSH是一种网络协议,用于计算机之间的加密登录。

如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。

最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑。1995年,芬兰学者Tatu Ylonen设计了SSH协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux系统的标准配置。

需要指出的是,SSH只是一种协议,存在多种实现,既有商业实现,也有开源实现。本文针对的实现是OpenSSH,它是自由软件,应用非常广泛。

此外,本文只讨论SSH在Linux Shell中的用法。如果要在Windows系统中使用SSH,会用到另一种软件PuTTY,这需要另文介绍。

二、最基本的用法

SSH主要用于远程登录。假定你要以用户名user,登录远程主机host,只要一条简单命令就可以了。

  $ ssh user@host

如果本地用户名与远程用户名一致,登录时可以省略用户名。

  $ ssh host

SSH的默认端口是22,也就是说,你的登录请求会送进远程主机的22端口。使用p参数,可以修改这个端口。

  $ ssh -p 2222 user@host

上面这条命令表示,ssh直接连接远程主机的2222端口。

三、中间人攻击

SSH之所以能够保证安全,原因在于它采用了公钥加密。

整个过程是这样的:(1)远程主机收到用户的登录请求,把自己的公钥发给用户。(2)用户使用这个公钥,将登录密码加密后,发送回来。(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。

这个过程本身是安全的,但是实施的时候存在一个风险:如果有人截获了登录请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪。因为不像https协议,SSH协议的公钥是没有证书中心(CA)公证的,也就是说,都是自己签发的。

可以设想,如果攻击者插在用户与远程主机之间(比如在公共的wifi区域),用伪造的公钥,获取用户的登录密码。再用这个密码登录远程主机,那么SSH的安全机制就荡然无存了。这种风险就是著名的“中间人攻击”(Man-in-the-middle attack)。

SSH协议是如何应对的呢?

四、口令登录

如果你是第一次登录对方主机,系统会出现下面的提示:

  $ ssh user@host

  The authenticity of host ‘host (12.18.429.21)’ can’t be established.

  RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.

  Are you sure you want to continue connecting (yes/no)?

这段话的意思是,无法确认host主机的真实性,只知道它的公钥指纹,问你还想继续连接吗?

所谓”公钥指纹”,是指公钥长度较长(这里采用RSA算法,长达1024位),很难比对,所以对其进行MD5计算,将它变成一个128位的指纹。上例中是98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d,再进行比较,就容易多了。

很自然的一个问题就是,用户怎么知道远程主机的公钥指纹应该是多少?回答是没有好办法,远程主机必须在自己的网站上贴出公钥指纹,以便用户自行核对。

假定经过风险衡量以后,用户决定接受这个远程主机的公钥。

  Are you sure you want to continue connecting (yes/no)? yes

系统会出现一句提示,表示host主机已经得到认可。

  Warning: Permanently added ‘host,12.18.429.21’ (RSA) to the list of known hosts.

然后,会要求输入密码。

  Password: (enter password)

如果密码正确,就可以登录了。

当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。

每个SSH用户都有自己的known_hosts文件,此外系统也有一个这样的文件,通常是/etc/ssh/ssh_known_hosts,保存一些对所有用户都可信赖的远程主机的公钥。

五、公钥登录

使用密码登录,每次都必须输入密码,非常麻烦。好在SSH还提供了公钥登录,可以省去输入密码的步骤。

所谓”公钥登录”,原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。

这种方法要求用户必须提供自己的公钥。如果没有现成的,可以直接用ssh-keygen生成一个:

  $ ssh-keygen

运行上面的命令以后,系统会出现一系列提示,可以一路回车。其中有一个问题是,要不要对私钥设置口令(passphrase),如果担心私钥的安全,这里可以设置一个。

运行结束以后,在$HOME/.ssh/目录下,会新生成两个文件:id_rsa.pub和id_rsa。前者是你的公钥,后者是你的私钥。

这时再输入下面的命令,将公钥传送到远程主机host上面:

  $ ssh-copy-id user@host

好了,从此你再登录,就不需要输入密码了。

如果还是不行,就打开远程主机的/etc/ssh/sshd_config这个文件,检查下面几行前面”#”注释是否取掉。

  RSAAuthentication yes
  PubkeyAuthentication yes
  AuthorizedKeysFile .ssh/authorized_keys

然后,重启远程主机的ssh服务。

  // ubuntu系统
  service ssh restart

  // debian系统
  /etc/init.d/ssh restart

六、authorized_keys文件

远程主机将用户的公钥,保存在登录后的用户主目录的$HOME/.ssh/authorized_keys文件中。公钥就是一段字符串,只要把它追加在authorized_keys文件的末尾就行了。

这里不使用上面的ssh-copy-id命令,改用下面的命令,解释公钥的保存过程:

  $ ssh user@host ‘mkdir -p .ssh && cat >> .ssh/authorized_keys’ < ~/.ssh/id_rsa.pub

这条命令由多个语句组成,依次分解开来看:(1)”$ ssh user@host”,表示登录远程主机;(2)单引号中的mkdir .ssh && cat >> .ssh/authorized_keys,表示登录后在远程shell上执行的命令:(3)”$ mkdir -p .ssh”的作用是,如果用户主目录中的.ssh目录不存在,就创建一个;(4)’cat >> .ssh/authorized_keys’ < ~/.ssh/id_rsa.pub的作用是,将本地的公钥文件~/.ssh/id_rsa.pub,重定向追加到远程文件authorized_keys的末尾。

写入authorized_keys文件后,公钥登录的设置就完成了。

SSH原理与运用(二):远程操作与端口转发

七、远程操作

SSH不仅可以用于远程主机登录,还可以直接在远程主机上执行操作。

上一节的操作,就是一个例子:

  $ ssh user@host ‘mkdir -p .ssh && cat >> .ssh/authorized_keys’ < ~/.ssh/id_rsa.pub

单引号中间的部分,表示在远程主机上执行的操作;后面的输入重定向,表示数据通过SSH传向远程主机。

这就是说,SSH可以在用户和远程主机之间,建立命令和数据的传输通道,因此很多事情都可以通过SSH来完成。

下面看几个例子。

【例1】

将$HOME/src/目录下面的所有文件,复制到远程主机的$HOME/src/目录。

  $ cd && tar czv src | ssh user@host ‘tar xz’

【例2】

将远程主机$HOME/src/目录下面的所有文件,复制到用户的当前目录。

  $ ssh user@host ‘tar cz src’ | tar xzv

【例3】

查看远程主机是否运行进程httpd。

  $ ssh user@host ‘ps ax | grep [h]ttpd’

八、绑定本地端口

既然SSH可以传送数据,那么我们可以让那些不加密的网络连接,全部改走SSH连接,从而提高安全性。

假定我们要让8080端口的数据,都通过SSH传向远程主机,命令就这样写:

  $ ssh -D 8080 user@host

SSH会建立一个socket,去监听本地的8080端口。一旦有数据传向那个端口,就自动把它转移到SSH连接上面,发往远程主机。可以想象,如果8080端口原来是一个不加密端口,现在将变成一个加密端口。

九、本地端口转发

有时,绑定本地端口还不够,还必须指定数据传送的目标主机,从而形成点对点的”端口转发”。为了区别后文的”远程端口转发”,我们把这种情况称为”本地端口转发”(Local forwarding)。

假定host1是本地主机,host2是远程主机。由于种种原因,这两台主机之间无法连通。但是,另外还有一台host3,可以同时连通前面两台主机。因此,很自然的想法就是,通过host3,将host1连上host2。

我们在host1执行下面的命令:

  $ ssh -L 2121:host2:21 host3

命令中的L参数一共接受三个值,分别是”本地端口:目标主机:目标主机端口”,它们之间用冒号分隔。这条命令的意思,就是指定SSH绑定本地端口2121,然后指定host3将所有的数据,转发到目标主机host2的21端口(假定host2运行FTP,默认端口为21)。

这样一来,我们只要连接host1的2121端口,就等于连上了host2的21端口。

  $ ftp localhost:2121

“本地端口转发”使得host1和host3之间仿佛形成一个数据传输的秘密隧道,因此又被称为”SSH隧道”。

下面是一个比较有趣的例子。

  $ ssh -L 5900:localhost:5900 host3

它表示将本机的5900端口绑定host3的5900端口(这里的localhost指的是host3,因为目标主机是相对host3而言的)。

另一个例子是通过host3的端口转发,ssh登录host2。

  $ ssh -L 9001:host2:22 host3

这时,只要ssh登录本机的9001端口,就相当于登录host2了。

  $ ssh -p 9001 localhost

上面的-p参数表示指定登录端口。

十、远程端口转发

既然”本地端口转发”是指绑定本地端口的转发,那么”远程端口转发”(remote forwarding)当然是指绑定远程端口的转发。

还是接着看上面那个例子,host1与host2之间无法连通,必须借助host3转发。但是,特殊情况出现了,host3是一台内网机器,它可以连接外网的host1,但是反过来就不行,外网的host1连不上内网的host3。这时,”本地端口转发”就不能用了,怎么办?

解决办法是,既然host3可以连host1,那么就从host3上建立与host1的SSH连接,然后在host1上使用这条连接就可以了。

我们在host3执行下面的命令:

  $ ssh -R 2121:host2:21 host1

R参数也是接受三个值,分别是”远程主机端口:目标主机:目标主机端口”。这条命令的意思,就是让host1监听它自己的2121端口,然后将所有数据经由host3,转发到host2的21端口。由于对于host3来说,host1是远程主机,所以这种情况就被称为”远程端口绑定”。

绑定之后,我们在host1就可以连接host2了:

  $ ftp localhost:2121

这里必须指出,”远程端口转发”的前提条件是,host1和host3两台主机都有sshD和ssh客户端。

十一、SSH的其他参数

SSH还有一些别的参数,也值得介绍。

N参数,表示只连接远程主机,不打开远程shell;T参数,表示不为这个连接分配TTY。这个两个参数可以放在一起用,代表这个SSH连接只用来传数据,不执行远程操作。

  $ ssh -NT -D 8080 host

f参数,表示SSH连接成功后,转入后台运行。这样一来,你就可以在不中断SSH连接的情况下,在本地shell中执行其他操作。

  $ ssh -f -D 8080 host

要关闭这个后台连接,就只有用kill命令去杀掉进程。

十二、参考文献

  * SSH, The Secure Shell: The Definitive Guide: 2.4. Authentication by Cryptographic Key, O’reilly

  * SSH, The Secure Shell: The Definitive Guide: 9.2. Port Forwarding, O’reilly

  * Shebang: Tips for Remote Unix Work (SSH, screen, and VNC)

  * brihatch: SSH Host Key Protection

  * brihatch: SSH User Identities

  * IBM developerWorks: 实战 SSH 端口转发

  * Jianing YANG:ssh隧道技术简介

  * WikiBooks: Internet Technologies/SSH

  * Buddhika Chamith: SSH Tunneling Explained

SSH使用指南

介绍SSH
什么 是SSH?
传统的网络服务程序,如:ftp、pop和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非 常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的,就是很容易受到“中间人”(man-in-the-middle)这 种方式的攻击。所谓 “中间人”的攻击方式,就是“中间人”冒充真正的服务器接收你的传给服务器的数据,然后再冒充你把数据传给真正的服务器。服务器和你之间的数据传送被“中 间人”一转手做了手脚之后,就会出现很严重的问题。

SSH的英文全称是Secure SHell。通过使用SSH,你可以把所有传输的数据进行加密,这样“中间人”这种攻击方式就不可能实现了,而且也能够防止DNS和IP欺骗。还有一个额 外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替telnet,又可以为ftp、pop、甚至ppp提供一 个安全的“通道”。

最初SSH是由芬兰的一家公司开发的。但是因为受版权和加密算法的限制,现在很多人都转而使用OpenSSH。 OpenSSH是SSH的替代软件,而且是免费的,可以预计将来会有越来越多的人使用它而不是SSH。

SSH是由客户端和服务端的软件组 成的,有两个不兼容的版本分别是:1.x和2.x。用SSH 2.x的客户程序是不能连接到SSH 1.x的服务程序上去的。OpenSSH 2.x同时支持SSH 1.x和2.x。

SSH的安全验证是如何工作的
从客户端来看,SSH提供两种级别的安全验证。

第 一种级别(基于口令的安全验证)只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连 接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。

第二种级别(基于密匙的安全验证)需要依靠密 匙,也就是你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的 密匙进行安全验证。服务器收到请求之后,先在你在该服务器的家目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务 器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。

用 这种方式,你必须知道自己密匙的口令。但是,与第一种级别相比,第二种级别不需要在网络上传送口令。

第二种级别不仅加密所有传送的数据, 而且“中间人”这种攻击方式也是不可能的(因为他没有你的私人密匙)。但是整个登录的过程可能需要10秒。

安装并测试OpenSSH
因 为受到美国法律的限制,在很多Linux的发行版中都没有包括OpenSSH。但是,可以从网络上下载并安装OpenSSH(有关OpenSSH的安装和 配置请参考:http://www.linuxaid.com.cn/engineer/brimmer/html/OpenSSH.htm)。

安 装完OpenSSH之后,用下面命令测试一下:

ssh -l [your accountname on the remote host] [address of the remote host]

如果OpenSSH工作正常,你会看到下面的提示信息:

The authenticity of host [hostname] can’t be established.
Key fingerprint is 1024 5f:a0:0b:65:d3:82:df:ab:44:62:6d:98:9c:fe:e9:52.
Are you sure you want to continue connecting (yes/no)?

OpenSSH告诉你它不知 道这台主机,但是你不用担心这个问题,因为你是第一次登录这台主机。键入“yes”。这将把这台主机的“识别标记”加到“~/.ssh /know_hosts”文件中。第二次访问这台主机的时候就不会再显示这条提示信息了。

然后,SSH提示你输入远程主机上你的帐号的口 令。输入完口令之后,就建立了SSH连接,这之后就可以象使用telnet那样使用SSH了。

SSH的密匙
生成你自己的密匙对
生 成并分发你自己的密匙有两个好处:

1) 可以防止“中间人”这种攻击方式

2) 可以只用一个口令就登录到所有你想登录的服务器上

用下面的命令可以生成密匙:

ssh-keygen

如果 远程主机使用的是SSH 2.x就要用这个命令:

ssh-keygen –d

在同一台主机上同时有SSH1和SSH2的 密匙是没有问题的,因为密匙是存成不同的文件的。

ssh-keygen命令运行之后会显示下面的信息:

Generating RSA keys: ……………………….ooooooO……ooooooO
Key generation complete.
Enter file in which to save the key (/home/[user]/.ssh/identity):
[按下ENTER就行了]
Created directory ‘/home/[user]/.ssh’.
Enter passphrase (empty for no passphrase):
[输 入的口令不会显示在屏幕上]
Enter same passphrase again:
[重新输入一遍口令,如果忘记了口令就只能重新生 成一次密匙了]
Your identification has been saved in /home/[user]/.ssh/identity.
[这是你的私人密匙]
Your public key has been saved in /home/[user]/.ssh/identity.pub.
The key fingerprint is: 2a:dc:71:2f:27:84:a2:e4:a1:1e:a9:63:e2:fa:a5:89 [user]@[local machine]

“ssh-keygen –d”做的是几乎同样的事,但是把一对密匙存为(默认情况下)“/home/[user]/.ssh/id_dsa”(私人密匙)和“/home /[user]/.ssh/id_dsa.pub”(公用密匙)。

现在你有一对密匙了:公用密匙要分发到所有你想用ssh登录的远程主机 上去;私人密匙要好好地保管防止别人知道你的私人密匙。用“ls –l ~/.ssh/identity”或“ls –l ~/.ssh/id_dsa”所显示的文件的访问权限必须是“-rw——-”。

如果你怀疑自己的密匙已经被别人知道了,不要迟疑 马上生成一对新的密匙。当然,你还要重新分发一次公用密匙。

分发公用密匙
在每一个你需要用SSH连接的远程服务器上,你要在自己 的家目录下创建一个“.ssh”的子目录,把你的公用密匙“identity.pub” 拷贝到这个目录下并把它重命名为“authorized_keys”。然后执行:

chmod 644 .ssh/authorized_keys

这一步是必不可少的。如果除了你之外别人对“authorized_keys”文件也有写的权 限,SSH就不会工作。

如果你想从不同的计算机登录到远程主机,“authorized_keys”文件也可以有多个公用密匙。在这种情 况下,必须在新的计算机上重新生成一对密匙,然后把生成的“identify.pub”文件拷贝并粘贴到远程主机的“authorized_keys”文 件里。当然在新的计算机上你必须有一个帐号,而且密匙是用口令保护的。有一点很重要,就是当你取消了这个帐号之后,别忘了把这一对密匙删掉。

配 置SSH
配置客户端的软件
OpenSSH有三种配置方式:命令行参数、用户配置文件和系统级的配置文件(“/etc/ssh /ssh_config”)。命令行参数优先于配置文件,用户配置文件优先于系统配置文件。所有的命令行的参数都能在配置文件中设置。因为在安装的时候没 有默认的用户配置文件,所以要把 “/etc/ssh/ssh_config”拷贝并重新命名为“~/.ssh/config”。

标准的 配置文件大概是这样的:

[lots of explanations and possible options listed]
# Be paranoid by default
Host *
ForwardAgent no
ForwardX11 no
FallBackToRsh no

还有很多选项的设置可以用“man ssh”查看“CONFIGURATION FILES”这一章。

配置文件是 按顺序读取的。先设置的选项先生效。

假定你在www.foobar.com上有一个名为“bilbo”的帐号。而且你要把“ssh- agent”和“ssh-add”结合起来使用并且使用数据压缩来加快传输速度。因为主机名太长了,你懒得输入这么长的名字,用“fbc”作为 “www.foobar.com”的简称。你的配置文件可以是这样的:

Host *fbc
HostName www.foobar.com
User bilbo
ForwardAgent yes
Compression yes
# Be paranoid by default
Host *
ForwardAgent no
ForwardX11 no
FallBackToRsh no

你输入“ssh fbc”之后,SSH会自动地从配置文件中找到主机的全名,用你的用户名登录并且用“ssh-agent”管理的密匙进行安全验证。这样很方便吧!

用 SSH连接到其它远程计算机用的还是“paranoid(偏执)”默认设置。如果有些选项没有在配置文件或命令行中设置,那么还是使用默认的 “paranoid”设置。

在我们上面举的那个例子中,对于到www.foobar.com的SSH连接:“ForwardAgent” 和“Compression”被设置为 “Yes”;其它的设置选项(如果没有用命令行参数)“ForwardX11”和“FallBackToRsh”都被设置成“No”。

其 它还有一些需要仔细看一看的设置选项是:

l CheckHostIP yes

这个选项用来进行IP地址的检查以防止 DNS欺骗。

l CompressionLevel

压缩的级别从“1”(最快)到“9”(压缩率最高)。默认值为 “6”。

l ForwardX11 yes

为了在本地运行远程的X程序必须设置这个选项。

l LogLevel DEBUG

当SSH出现问题的时候,这选项就很有用了。默认值为“INFO”。

配置服务端的软件
SSH 服务器的配置使用的是“/etc/ssh/sshd_config”配置文件,这些选项的设置在配置文件中已经有了一些说明而且用“man sshd”也可以查看帮助。请注意OpenSSH对于SSH 1.x和2.x没有不同的配置文件。

在默认的设置选项中需要注意的有:

l PermitRootLogin yes

最好把这个选项设置成“PermitRootLogin without-password”,这样“root”用户就不能从没有密匙的计算机上登录。把这个选项设置成“no”将禁止“root”用户登录,只能 用“su”命令从普通用户转成“root”。

l X11Forwarding no

把这个选项设置成“yes”允许用户 运行远程主机上的X程序。就算禁止这个选项也不能提高服务器的安全因为用户可以安装他们自己的转发器(forwarder),请参看“man sshd”。

l PasswordAuthentication yes

把这个选项设置为“no”只允许用户用基于密匙 的方式登录。这当然会给那些经常需要从不同主机登录的用户带来麻烦,但是这能够在很大程度上提高系统的安全性。基于口令的登录方式有很大的弱点。

l # Subsystem /usr/local/sbin/sftpd

把最前面的#号去掉并且把路径名设置成“/usr/bin /sftpserv”,用户就能使用“sftp”(安全的FTP)了(sftpserv在 sftp软件包中)。因为很多用户对FTP比较熟悉而且“scp”用起来也有一些麻烦,所以“sftp”还是很有用的。而且2.0.7版本以后的图形化的 ftp工具“gftp”也支持“sftp”。

拷贝文件
用“scp”拷贝文件
SSH提供了一些命令和shell用来登录 远程服务器。在默认情况下它不允许你拷贝文件,但是还是提供了一个“scp”命令。

假定你想把本地计算机当前目录下的一个名为 “dumb”的文件拷贝到远程服务器www.foobar.com上你的家目录下。而且你在远程服务器上的帐号名为“bilbo”。可以用这个命令:

scp dumb bilbo@www.foobar.com:.

把文件拷贝回来用这个命令:

scp bilbo@www.foobar.com:dumb .

“scp”调用SSH进行登录,然后拷贝文件,最后调用SSH关闭这个连接。

如 果在你的“~/.ssh/config”文件中已经为www.foobar.com做了这样的配置:

Host *fbc
HostName www.foobar.com
User bilbo
ForwardAgent yes

那么你就可以用“fbc”来代替 “bilbo@www.foobar.com”,命令就简化为“scp dumb fbc:.”。

“scp”假定你在远程主机上的家目录 为你的工作目录。如果你使用相对目录就要相对于家目录。

用“scp”命令的“-r”参数允许递归地拷贝目录。“scp”也可以在两个不同 的远程主机之间拷贝文件。

有时候你可能会试图作这样的事:用SSH登录到www.foobar.com上之后,输入命令“scp [local machine]:dumb .”想用它把本地的“dumb”文件拷贝到你当前登录的远程服务器上。这时候你会看到下面的出错信息:

ssh: secure connection to [local machine] refused

之所以会出现这样的出错信息是因为你运行 的是远程的“scp”命令,它试图登录到在你本地计算机上运行的SSH服务程序……所以最好在本地运行“scp”除非你的本地计算机也运行SSH服务程 序。

用“sftp”拷贝文件
如果你习惯使用ftp的方式拷贝文件,可以试着用“sftp”。“sftp”建立用SSH加密的安全 的FTP连接通道,允许使用标准的ftp命令。还有一个好处就是“sftp”允许你通过“exec”命令运行远程的程序。从2.0.7版以后,图形化的 ftp客户软件“gftp”就支持“sftp”。

如果远程的服务器没有安装sftp服务器软件“sftpserv”,可以把 “sftpserv”的可执行文件拷贝到你的远程的家目录中(或者在远程计算机的$PATH环境变量中设置的路径)。“sftp”会自动激活这个服务软 件,你没有必要在远程服务器上有什么特殊的权限。

用“rsync”拷贝文件
“rsync”是用来拷贝、更新和移动远程和本地文件 的一个有用的工具,很容易就可以用“-e ssh”参数和SSH结合起来使用。“rsync”的一个优点就是,不会拷贝全部的文件,只会拷贝本地目录和远程目录中有区别的文件。而且它还使用很高效 的压缩算法,这样拷贝的速度就很快。

用“加密通道”的ftp拷贝文件
如果你坚持要用传统的FTP客户软件。SSH可以为几乎所有 的协议提供“安全通道”。FTP是一个有一点奇怪的协议(例如需要两个端口)而且不同的服务程序和服务程序之间、客户程序和客户程序之间还有一些差别。

实 现“加密通道”的方法是使用“端口转发”。你可以把一个没有用到的本地端口(通常大于1000)设置成转发到一个远程服务器上,然后只要连接本地计算机上 的这个端口就行了。有一点复杂是吗?

其实一个基本的想法就是,转发一个端口,让SSH在后台运行,用下面的命令:

ssh [user@remote host] -f -L 1234:[remote host]:21 tail -f /etc/motd

接 着运行FTP客户,把它设置到指定的端口:

lftp -u [username] -p 1234 localhost

当 然,用这种方法很麻烦而且很容易出错。所以最好使用前三种方法。

用SSH设置“加密通道”
“加密通道”的基础知识
SSH 的“加密通道”是通过“端口转发”来实现的。你可以在本地端口(没有用到的)和在远程服务器上运行的某个服务的端口之间建立“加密通道”。然后只要连接到 本地端口。所有对本地端口的请求都被SSH加密并且转发到远程服务器的端口。当然只有远程服务器上运行SSH服务器软件的时候“加密通道”才能工作。可以 用下面命令检查一些远程服务器是否运行SSH服务:

telnet [full name of remote host] 22

如 果收到这样的出错信息:

telnet: Unable to connect to remote host: Connection refused

就说明远程服务器上没有运行SSH服务软件。

端口转发使用这样的命令语法:

ssh -f [username@remote host] -L [local port]:[full name of remote host]:[remote port] [some command]

你不仅可以转发多个端口而且可以在“~/.ssh /config”文件中用“LocalForward”设置经常使用的一些转发端口。

为POP加上“加密通道”
你可以用POP协 议从服务器上取email。为POP加上“加密通道”可以防止POP的密码被网络监听器(sniffer)监听到。还有一个好处就是SSH的压缩方式可以 让邮件传输得更快。

假定你在pop.foobar.com上有一个POP帐号,你的用户名是“bilbo”你的POP口令是 “topsecret”。用来建立SSH“加密通道”的命令是:

ssh -f -C bilbo@pop.foobar.com -L 1234:pop.foobar.com:110 sleep 5

(如果要测试,可以把“sleep”的值加到500)。运行这个命令之 后会提示你输入POP口令:

bilbo@pop.foobar.com’s password:

输入口令之后就可以用 “telnet”连接到本地的转发端口了。

telnet localhost 1234

你会收到远程mail服务器的 “READY”消息。

当然,这个方法要求你手工输入所有的POP命令,这是很不方便的。可以用Fetchmail(参考how to configure Fetchmail)。Secure POP via SSH mini-HOWTO、man fetchmail和在“/usr/doc/fetchmail-[…]”目录下的Fetchmail的FAQ都提供了一些具体的例子。

请 注意IMAP协议使用的是不同的端口:IMAP v2的端口号为143而IMAP v3的端口号为220。

为X加上“加密通道”
如 果你打算在本地计算机上运行远程SSH服务器上的X程序,那么登录到远程的计算机上,创建一个名为“~/.ssh/environment”的文件并加上 这一行:

XAUTHORITY=/home/[remote user name]/.Xauthority

(如果在远 程主机上你的家目录下不存在“.Xauthority”这个文件,那么当用SSH登录的时候就会自动创建)。

比如启动一个X程序 (xterm)可以这个命令:

ssh -f -X -l [remote user name] [remote machine] xterm

这将在远程运行xterm这个程序。其它的X程序也是用相同的方法。

为linuxconf加上“加密通道”
Linuxconf 是Linux的配置工具,它支持远程管理。Linuxconf的FAQ重说明了如何通过SSH使用linuxconf:

其命令为:

remadmin –exec [link_command] linuxconf –guiproto

如果你想在两台计算机之间用加密的方式传送信 息,那么最好用ssh。命令是:

remadmin –exec ssh -l [account] linuxconf –guiproto

这是非常有效的而且运行用图形界面管理计算机。

这种方法需要在客户端安装linuxconf。其它 的方法还有直接登录到服务器上用“X11Forwarding”或字符界面运行linuxconf。

为Webmin加上“加密通道”
Webmin 是一个新的基于浏览器的配置工具。它运行在1000端口。你可以用SSH的“端口转发”对它进行加密:

ssh -f -l [remote user name] [remote host] -L 1234:[remote host]:10000 tail -f /etc/motd

把浏览器指向

http://localhost:1234′

作者:

喜欢围棋和编程。

 
发布于 分类 编程标签

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注