存档

文章标签 ‘ssh’

命令行ssh在远程服务器上su执行程序的情况

2011年6月12日 没有评论

需求来源:
组里某人的私钥丢了,没法登录服务器,需要给他把公钥重新部署在他要登录的服务器。
背景资料:
公司的服务器都是key认证的,而且都已经禁止root直接登录,这个家伙的私钥丢失导致我们需要在所有的100多台服务器上重新部署他新生成的公钥!
解决方法的基本思路:
用普通用户ssh上每一台服务器执行命令

su -c wget -O ~someone/.ssh/authorized_keys http://192.168.0.1/public_key4someone
这里的someone是某人的帐号

但上面这个命令其实是有问题的,因为su -c只支持单个命令,所以上面这个命令直接在本地执行都会报”su: user xxx does not exist”,这是因为su只把wget当作命令,因为前面没有指定su成的用户,所以把后面的部分当成用户名了,解决问题也很简单,这样:

su - root -c "wget -O ~someone/.ssh/authorized_keys http://192.168.0.1/public_key4someone"

su -c "wget -O ~someone/.ssh/authorized_keys http://192.168.0.1/public_key4someone"

总之,诀窍就是要把命令用双引号引起来。
好,本地执行现在没有问题了,现在要远程执行,假设要在服务器192.168.0.2上执行,命令大概是这样的:

ssh 192.168.0.2 su -c “wget -O ~someone/.ssh/authorized_keys http://192.168.0.1/public_key4someone”

这样执行实际也是有问题的。会报错:“standard in must be a tty”
这是因为su只能从tty中读入密码。这个也好解决,ssh命令加上”-t”参数就行,像这样:

ssh -t 192.168.0.2 su -c "wget -O ~someone/.ssh/authorized_keys http://192.168.0.1/public_key4someone"

但当你这样执行的时候会发现还会报开始的用户不存在的错误,像这样:“su: user xxx does not exist”
这样的话,最后是这样解决的:

ssh -t 192.168.0.2 'su -c "wget -O ~someone/.ssh/authorized_keys http://192.168.0.1/public_key4someone"'

现在就应该能正确执行了。至于这里为什么要加对单引号,我也不确认知道,反正成功了,:-)

btw:其实这整个解决方案还是有问题的,你需要手工输入每一台服务器的密码呀!

分类: TroubleShooting 标签: ,

用ssh打洞反穿防火墙

2010年9月15日 没有评论

前段时间

家里那台公司配的服役了五年的hp的本本

终于悲剧性的挂掉了

平时不觉得,他这一挂

还真有点不方便

首先

公司vpn的客户端软件是跑在这个本本上的

不是说这个vpn客户端软件别的系统下不能跑(ubuntu下实在也有相应软件)

而是这个cisco的东东,连接vpn需要一个组的名字和组密码

而且两者,都是由公司系统组打包好了存到机器里的

组的名字倒是可以看见

但是密码却看不了(全是黑点代替的)

而且,家里除了这个挂掉的本

再没有其他的windows系统

所以vpn也是悲剧性的不可能再连上了

于是为了从家里能够登录公司办公网的自己的工作pc(毕竟很多资源都在那上面)

我搞了个ssh穿墙的方案

我从公司ssh连上一台有公网的服务器

同时在其远程将127.0.0.1的某个端口,假设是22222的请求转回本地(pc)端的3389端口

这类似于命令ssh -R的功能

然后我在家里用ssh从这台机器的公网连上去

同时将本地(家里机器)的127.0.0.1的3389端口通过这个ssh连接转发到远程(有公网的机器)的127.0.0.1接口上的前面提到的那个端口,这里是22222

这里利用的是ssh -L的功能

最后

在家里的机器上用termianl service client连127.0.0.1的3389端口

就连上公司办公室自己的机器的termial sercice

分类: tips 标签: , , , , , ,

debian5上涌xen装debian4时的问题

2010年5月7日 没有评论

朋友有台debian5的机器
上面装了自带的xen3.2.1
想在vm(xen)上再装个debian4
xen-create-image后
xm create vm1.cfg
启动这个vm(hostname=vm1)后
xm console vm1
进去发现没有获得shell
停在启动crond的后面
ssh连过去一看
出错提示:

PTY allocation request failed on channel 0
stdin: is not a tty

网上找了找
说是没装udev的原因
于是
xen-create-image时带上参数–role=udev
这样的话在安装的时候会装上udev包
重新做完,再重新起起来
xm console vm1看还是停在crond刚启动完的那里
但是ssh上去貌似已经好了

翻墙上twitter貌似需要启用远程dns

2010年1月25日 1 条评论

直接用ssh搭了个socks的代理
结果其他站点都能上
但是twitter还是不行
但是在服务器端访问twitter是没有问题的
nslookup一看
发现貌似twitter的域名解析被劫持

firefox下好办
直接启用远端dns即可
具体做法:
在地址栏里输入:
about:config
再将键值:network.proxy.socks_remote_dns改成true(缺省值是false)即可

using secureCRT to create a port forward via ssh

2009年12月7日 没有评论

利用securecrt建立一个基于ssh的port forward
这个干嘛用啊
打洞呀,也可以理解是翻墙
网上一般是用putty来做例子说明设置ip tunnel来翻墙
我找了找
其实secureCRT也一样能行
只不过securecrt里没有明显字样tunnel的设置
而是叫port forward
其实设置起来也巨简单
假设你已经用secureCRT连到了你要打洞到的那台服务器上
点击secureCRT菜单Options–>Session Options….
再点击左边导航菜单里的Port forwarding
再在右边点击Add…
Name随便填,我这里填D36725,是沿用的putty的命名方法
Local里的那个port是本地监听的端口,随便设,只要小于65536且不跟别的已有相同即可
Remote里钩上”Dynamic forwarding using SOCKS 4 or 5″即可
如下图:
portforward
然后再点OK返回
如下图:
tunnel_scrt
最后再点OK就行了
在本机netstat -na 一下,看看36725这个本地端口有没有在监听状态?
没有的话把secureCRT断开再重连一下
基本上就没有问题了

mtu值导致ssh连接严重丢包

2009年8月4日 2 条评论

前面碰到的问题
其实大概原因是这样的
Linux1–>vpn1<-->vpn2–>Linux2
vpn1和vpn2之间是走公网搭的一个vpn连接
这样
当从Linux1上ssh连接到Linux2上的时候
登录正常
当某个命令需要从Linux2返回大量的数据回Linux1的时候
由于某些ip包大小大于mtu值
而且被置DF位(不允许分片)或者是ip包允许分片但是vpn1或vpn2不允许分片的ip包通过
所以导致Linux1收不到其他的大ip包
导致看起来是ssh session挂掉
其实
tcp层有路径最小mtu值发现功能
为什么没生效呢?
其实不是这样的
比如当Linux2回来的大包分成1500一片到达vpn2
vpn2上还要给其打上4个字节的GRE头(如果vpn用的GRE通道的话)
再加上外层的20字节的ip头
这一下就超过vpn1公网(vpn是通过公网连起来的)以太网口的mtu值1500!!
于是返回“MTU of next hop: 1500”的错误
这样的话Linux2还会以1500来分片发送大包
这样循环下去,Linux1永远也不会收到来自Linux2的大的ip包
ssh session自然就“挂”了

原因明白了
那么解决起来就容易了
无非是改小mtu值嘛
那改成多少合适呢
很简单
改成1500-4-20=1476就行(其实小于这个数也行,不过mtu自然是要最大的)
于是ifconfig eth0 mtu 1476
再ssh登录
dmesg
都没问题了,搞定

分类: TroubleShooting 标签: , , , ,

诡异现象:echo一个字串都会导致ssh sesion退出

2009年4月27日 1 条评论

就好像是敲入exit命令或Ctrl+D一样
奇怪的是
在我的两台rhel as5的机器上有这个问题
在另外两台fedora core的机器上就没问题
貌似可能还不是echo的版本的问题(2台fc,一台是”echo (GNU coreutils) 5.2.1″,一台是”echo (GNU coreutils) 6.9″,都没问题)
两台有问题的rhel as5都是”echo (GNU coreutils) 5.97″

貌似跟shell有关系
我换了tcsh和 zsh都没问题
然后再敲bash回bash
再echo的话
就报”Segmentation fault”

使用perl包Net::SSH::Perl时的小问题

2008年12月1日 没有评论

工作需要
用perl写了个程序ssh到一些机器上去做一些操作
于是就用了Net::SSH::Perl这个perl模块儿
感觉这个东西还挺好用的
但有一个需要注意的
就是redhat系列的系统
自带的ssh client的全局配置文件是/etc/ssh/ssh_config
Net::SSH::Perl认的是/etc/ssh_config
因为这样
所以有台机器我用ssh命令直接连没有问题
但是通过Net::SSH::Perl就连不上
后来通过把/etc/ssh/ssh_config拷一份为/etc/ssh_config
这才搞定

利用ssh的x11 forward,在有X server的本地显示服务器上的GUI

2008年6月28日 没有评论

题目有点长
其实来自于一个朋友的问题
他的oracle跑在linux服务器上
远程的linux服务器并没有跑在图形界面下(runlevel=5)
而是跑在字符模式下(runlevel=3)
而他又想用图形界面来管理oracle
我翻了翻资料
找出一种方法
在一台图形界面的linux下(虚拟机也行,其实不是linux也行,关键是本地得有X server)
起一个控制台
用命令行ssh加参数”-X”连上远程的linux服务器
像这样
ssh -X oracle@1.1.1.1
这里”1.1.1.1″是远程linux服务器的ip地址
这样连上去之后
直接就可以用以前只有在图形界面上才能用的命令
如oracle管理的图形程序”dbca”

这个原理很简单
因为远程的sshd支持x11 forward
那么他起x程序的时候
就会把x的包通过ssh转回来到ssh客户端的机器上来
而ssh客户端这边跑得有x server
所以就能正确接收x包并显示出来

其实在windows下也可以通过安装x server软件来实现一样的效果
比如x manager就可以
具体用法不在详述

这里的关键在于
远程的sshd需要支持x11 forward
不过不要担心
一般情况下
缺省是支持的
:)