使用SSH(Secure shell),用户可以安全地访问远程的文件系统。并不是所有人都了解SSH的其他方面的应用,比如: 可以取消口令验证,在远程服务器上自动执行命令,甚至将远程系统中的一个文件夹挂载到本地。在这篇文章中我们会讲解这些功能,当然,还有更多。
作者: Borys Musielak
SSH以C/S方式工作。也就是说在我们想连接的服务器上必须有一个SSH的守护进程一直运行着。在现在的大多数Linux发行版本中,都预装有SSH。SSH服务可以以类似/
etc/init.d/ssh start
的方式开启。默认使用端口22,所以如果你安装有防火墙的话,要确保此端口已经被打开。当安装完并且启动SSH后,我们就可以从远程对服务器进行访问了。举个例子: user1要远程访问服务器romote_server(一个域名或者Ip地址),那么命令应该是像这样:ssh user1@romote_server
当输入密码后,用户就登录到了远程服务器上。当然,命令提示行也会相应改变,类似于:user1@remote_server:~$。如果命令行改变的话就代表着登录成功,并且可以开始在远程服务器上工作了。从现在开始我们所执行的所有命令都会在远程服务器上,当然在登录用户权利范围内。
SCP - 安全地拷贝文件
SCP是OpenSSH包的一部分,SCP允许用户以SSH协议安全地拷贝或者上传文件,文件夹。SSH+SCP兄弟完全可以替代现在被普遍使用但却不安全的FTP协议。并不是所有人都知道FTP协议中用户名和密码是以明文的防止进行传输的(很容易被黑客窃取)。SCP是一个很好的选择,并且使用起来很简单:
scp file.txt user1@remote_server:~/
这个命令的作用是拷贝本地文件file.txt到服务器上user1的目录中(~/)。当然,你也可以指定不同的目标文件夹,比如/tmp /home/public或者任何user1有写权限的文件夹。>
从服务器上拷贝文件到本地的命令像这样:
scp user1@remote_server:~/file.txt .
SCP其他参数:
- -r 递归地拷贝文件夹
- -P port 指定一个端口进行文件拷贝(不是默认的22端口),当然,要求服务器在该端口上有监听进程。当有防火墙保护的时候,这个命令会非常有用。将监听端口改为443(该端口主要用户https服务)是绕过管理员限制的最好的方法。
界面方式的SCP
如果我们不喜欢命令行方式,而希望有一个软件界面的话,Midnight Commander是一个不错的客户端程序。Nautilus和Konqueror也可以,在地址栏中输入ssh://user1@remote_server:~/同样可以访问远程服务器。然后你就可以在本地一样随意拷贝文件。
在Windows环境中,也有不错的软件 WinSC,该软件的界面跟Total Commander看起来差不多一样。另外,TotalCommander有一个插件也可以实现SCP。
不使用密码方式登录SSH
每次进行SSH连接的时候都要输入密码一定很烦,并且如果连接服务器的过程没有受到保护的话,那么就会出现很大的风险。解决的方法是使用公开-私有密钥进行访问控制。
密钥对可以通过执行ssh-keygen命令来产生。下面是一个例子,可以产生RSA或者DSA密钥
$ ssh-keygen -t rsa
Generating public/private rsa key pair.Enter file in which to save the key(/home/user1/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in
/home/user1/.ssh/id_rsa.
Your public key has been saved in
/home/user1/.ssh/id_rsa.pub.
The key fingerprint is:
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
当程序要求输入密码的时候,只需要回车,这样就会产生一个密钥。但是这样会降级安全性,请根据自己的情况酌情使用。当ssh-keygen运行完毕的时候,会产生两个密钥。私有密钥在/home/user1/.ssh/id_rsa,记住,这个文件永远也不能公开,公有密钥在/home/user1/.ssh/id_rsa.pub,这个是我们要对外公布的。
现在我们就可以使用刚才产生的密钥对进行登录了,而不使用密码。我们必须在远程服务器的~/.ssh文件夹中加入刚才产生的共有密钥文件。可以以下面的命令来实现:
$ scp /home/user1/.ssh/id_rsa.pub \
user1@remote_server:~/
$ ssh user1@remote_server
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
然后,我们就可以不使用密码,而是用密钥来进行访问控制了,省去了每次都必须输入密码的麻烦。注意,如果你想从远程服务器上反登陆到本地机器的话,需要在远程服务器上运行上述的命令重新产生密钥对,这个过程是单向的,也就是私有密钥会确认共有密钥的合法性,但是不能反过来。
在远程服务器上执行命令:
现在,我们可以不输入口令来登录远程服务器了,为什么不在服务器上执行一些命令呢?有很多有用的程序可以帮助我们,尤其是当我们需要在每天固定的时间执行一些命令的时候, 这在以前是不行的,因为以前每次登录的时候都需要输入密码。
一个有趣的情况就是“远程警告”,加入我们有一个很关键的进程运行在远程服务器上,比如一个运行在Apache上的网站,当系统资源耗尽的时候(比如磁盘空间不够用了或者服务器过载了),我们希望有一个警告,当然,我们可以发一封邮件,但是另外,我们更可以在本地的机器上产生一个警告声音,代码如下:
ssh user1@local_server 'play
/usr/share/sounds/gaim/arrive.wav'
这个命令会使user1自动登录本地机器,并且使用Play命令播放一个警报。实际中,这样的命令需要放到一个脚本文件中。
使用X11
SSH最新的功能是可以支持X11协议,这样我们就可以远程执行几乎所有的x程序。方式如下:
ssh -X user1@remote_serwer
然后,我们运行的x程序都会转发到本地的x server。我们可以修改文件/etc/ssh/ssh_config中的参数ForwardX11来永久地打开这个功能,当然,远程服务器端也必须打开Forward功能,而相应的配置文件是/etc/ssh/sshd_config。
如果我们仅仅想运行一个单独的程序的话,可以这样:
ssh -X user1@remote_serwer 'psi'
这个命令会启动远端的psi程序,然后将界面传送到本地。
当然,程序运行的速度依赖于网络的速度,局域网的话会运行的很好(甚至可以使用Totem播放的DivX电影),而如果使用DSL上互联网的话,那么像Skype和Thunderbird都可以运行的很好。
注意,如果X11 Forwarding属性没有激活的话同样可以使用SSH连接服务器,将DISPLAY属性指向本地然后同样可以运行X应用程序。但是这种方式仅仅是与远程服务器的X server通信,并且SSH并不起作用,因为这么配置跟SSH毫无关系。根据本地X server的配置,当远程服务器上的程序需要访问本地X server的时候,需要使用xhost命令打开本地X server相应的权限。比如xhost+host可以接受任何来自运行在host上程序的请求,如果要经常使用这个功能的话,本地的x server需要更加安全的配置。
SSHFS-挂载远程文件夹
通过SSH对远程的文件进行操作通常是意见很烦心的事情,尤其是当你互相拷贝文件的时候,使用 fish://可以解决问题,但是fish要比纯粹的SSH慢许多,尤其是当拷贝文件的时候,就更慢了。理想的解决办法就是通过SSH将远程的文件夹挂载到本地上,好消息是,已经有了实现,感谢 sshfs 和 fuse项目。
Fuse是最近才被加入到内核2.6中的,它是一个内核模块,允许没有特权的用户挂载不同的文件系统。而SSHFS是由同一作者编写的一个应用程序,改程序可以使得用户挂载远程的文件夹和文件系统。想法很简单,将远程的文件夹或者文件系统挂载到本地机器上,就像访问本地的文件系统一样,不同的是,文件会被在后台以SSH的方式传送到远程服务器上。
在Ubuntu上安装Fuse和SSHFS很容易:
# apt-get install sshfs
剩下的就是将用户添加到fuse用户组以得到可以挂载的权限。使用类似usermod -G fuse user1或者直接修改 /etc/group文件。然后加载fuse模块:
# modprobe fuse
登陆后就可以使用sshfs来挂载远程文件系统了。
mkdir ~/remote_folder
sshfs user1@remote_server:/tmp ~/remote_folder
上面的命令会将远程的/tmp文件夹挂载为本地的~/remote_folder。其实使用的是SCP来进行拷贝文件,当然也可以直接编辑,创建,删除文件。
当完成所需要做的工作的时候,我们可以将其卸载掉:
fusermount -u ~/remote_folder
如果我们每天都要进行这样的操作的话,最好还是将其加入到/etc/fstab表中,这样当系统启动的时候就会自动挂载远程文件系统,或者当手动挂载的时候也省去了指定远程服务器的麻烦(noauto选项需要打开)。这里有个简单的例子:
sshfs#user1@remote_server:/tmp \
/home/user1/remote_folder/ fuse defaults,auto 0 0
如果经常使用fuse和sshfs的话,我们需要编辑/etc/modules,加入fuse。否则的话,每次当我们想使用fuse的时候必须手动加载到内核。
总结
跟你看到的一样,SSH是一个强大的远程访问工具,如果你经常使用远程服务器的话,那么你需要花些时间来好好学习一下SSH的一些功能。SSH可以使得你的日常工作变得非常容易。
没有评论:
发表评论