6

SSH小技巧 - Limboy's HQ

 3 years ago
source link: https://limboy.me/2010/08/28/ssh-tips/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

SSH小技巧

2010-08-28

p(date). 2010-08-28

参考: Six Things I wish Mom told me(about ssh) Using Rsync and Ssh

用过linux的,对SSH应该就比较熟悉了,但有些技巧可能你未必知道。

连接成功后运行命令

我们都知道可以通过SSH获取远程shell,然后运行命令。如果只想运行单个命令的话,直接把命令附加在SSH命令之后即可,如

wdaher@rocksteady:~$ ssh bebop uname -a
Linux bebop 2.6.32-24-generic #39-Ubuntu SMP Wed Jul 28 05:14:15 UTC 2010 x86_64 GNU/Linux
这个最好结合无须输入密码的SSH登录。如果想获取python版本,直接"ssh hostname python -V”

但有些命令可能会报错,如"top”

wdaher@rocksteady:~$ ssh bebop top
TERM environment variable not set.
这时只需加上”-t"参数就行了。

这里我们执行ssh连接时并没有指定具体的主机名(ip)和用户,而只是"bebop”,这是如何做到的呢?且看下文

假如在一个主机上为不同用户分别开通了不同的ssh账号,连接时就得这样

wdaher@rocksteady:~$ ssh -p 2222 bob.example.com
wdaher@rocksteady:~$ ssh -p 8183 [email protected]
wdaher@rocksteady:~$ ssh -p 31337 -l waseemio wsd.example.com
很麻烦,而且端口或者其他参数有变动的话,不一定记得住。其实只要配置一下.ssh/config文件就可以了。

连接时,就变成这样了

wdaher@rocksteady:~$ ssh bob
wdaher@rocksteady:~$ ssh alice
wdaher@rocksteady:~$ ssh self

是不是很方便,如果SSH的参数改变的话,修改配置文件就行了,命令不变。

假设有这么个情况:你已下班回家,这时想要查看公司内网(analytics)的某个web页,但只能SSH到自己在公司的电脑(desktop),desktop和analytics在一个局域网。

先来看一段命令

ssh desktop -L 8080:desktop:80

这段命令表示的是ssh连到desktop后,转发本地8080端口到desktop的80端口,这时,如果访问"http://localhost:8080”,就会转发到desktop的80端口。这样的话,把desktop:80换成analytics:80不就大功告成了吗

ssh desktop -L 8080:analytics:80

这样访问本地的8080端口,就会转到analytics的80端口,通过desktop这个跳板。

更加一劳永逸的方法是使用-D参数,将desktop变成一个socks5代理服务器(对这个-D命令,大家应该都很熟悉了吧),然后在浏览器中配置代理为"localhost:8080”

ssh desktop -D 8080 desktop

这样所有的浏览器访问都会通过desktop进行转发,也就是说直接访问http://analytics就可以了。(analytics地址在hosts里配置,如192.168.1.110 analytics)

使用"~”

“~”(不包括引号)是ssh保留字符,在新行输入"~"后,可以配合很多键,其中最常用的就是"~.“和"~^Z”(Ctrl+Z)

“~.“会终止ssh连接,如果中断了连接,又不想等ssh session过期,就可以使用这个快捷键。

“~^Z"会把当前的ssh连接放到后台,等完成了其他工作后,再把这个连接取出来。

wdaher@rocksteady:~$ ssh bebop
wdaher@bebop:~$ sleep 10000
wdaher@bebop:~$ ~^Z [suspend ssh]

[1]+  Stopped                 ssh bebop
wdaher@rocksteady:~$ # Do something else
wdaher@rocksteady:~$ fg # and you're back!

通过authorized_keys指定登录后要执行的命令

这个跟前面提到的"连接成功后运行命令"不一样,这个命令是定义在authorized_keys里的,ssh连上后,只能执行该命令,并且执行完后立即退出。

先看看正常的authorized_keys

修改之后,就是这样

其实就是在最前面加了from和command,from表明从哪个ip连过来的,如果是用adsl拨号上网,ip会经常变动,可以把这个参数去掉。command表明连接成功后要执行的命令,可以在command里限制该用户可以执行的命令(别忘了加上可执行权限),假设限制该用户只能执行rsync命令:

#!/bin/sh

case "$SSH_ORIGINAL_COMMAND" in
*\&*)
echo "Rejected"
;;
*\(*)
echo "Rejected"
;;
*\{*)
echo "Rejected"
;;
*\;*)
echo "Rejected"
;;
*\<*)
echo "Rejected"
;;
*\`*)
echo "Rejected"
;;
*\|*)
echo "Rejected"
;;
rsync\ --server*)
$SSH_ORIGINAL_COMMAND
;;
*)
echo "Rejected"
;;
esac 

$SSH_ORIGINAL_COMMAND表示的是用户实际执行的命令

禁止Root用户登录

允许root用户登录太危险了(虽然很方便),因为可以删除任何文件,可以在’/etc/ssh/sshd_config’里配置一下。

PermitRootLogin no 
#或者只允许执行有限的命令
PermitRootLogin forced-commands-only 

免密码登录

先用ssh-keygen生成一对私钥和公钥,然后把公钥添加到远程主机的authorized_keys里就行了

#生成私钥和公钥,默认放在~/.ssh/文件夹下,也可以自定义,提示输入passphare时,直接回车
#顺利的话就会在~/.ssh/文件夹下生成id_rsa.pub和id_rsa两个文件
ssh-keygen -t rsa

#把id_rsa.pub上传到远程主机,方法很多,ssh-copy-id只是其中一种
ssh-copy-id username@hostname
#如果id_rsa.pub在其他文件夹下
ssh-copy-id -i /path/to/id_rsa.pub username@hostname

这样下次就可以直接登录了


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK