洛阳铲的日志

2010年01月22日

两个ssh相关的ruby脚本

Filed under: Linux,SSH — 标签:, , , , — HackGou @ 17:11

自从上次存储上面发现一个异常后,禁用不带密码的key。
而且关掉了sudo的nopasswd选项,
这下苦了我们自己,面对成百上千的服务器,需要拷贝个文件啊
或者root权限做个事情啊,那绝对是恶梦。为了拯救自己于恶梦,
利用NET::SSH,写了两个小脚本:

  1. 一个是scp.rb用来拷贝文件的,用法很简单:
    scp.rb hostA:/tmp/afile ./ 或者
    scp.rb afiel hostA:/tmp/afile
  2. 另外一个叫ssh_sudo.rb,看名字就知道,ssh来sudo的,比如:
    ssh_sudo.rb hostA cat /etc/shadow 会在HostA上面执行 cat /etc/shadow

把ssh_sudo.rb中,15行换成:
15 channel.exec(“#{cmd}”) do | ch, success|
就成了普通版的ssh了。这两个可以解决我80%的问题了。剩下20%就根据情况,临阵定夺了

################## scp.rb #####################

#!/usr/local/bin/ruby
require ‘net/scp’
password=”real_password
username=‘real_name’
src=ARGV[0]
dst=ARGV[1]
if ARGV[0] =~ /:/
host,remote_path=ARGV[0].split(“:”)
else
host,remote_path=ARGV[1].split(“:”)
end
Net::SCP.start( host, username, :password => password) do | scp |
if ARGV[0] =~ /:/
scp.download!( remote_path, dst )
else
scp.upload!( src, remote_path )
end
end
################## end scp.rb #####################

######################## ssh_sudo.rb #######################

#!/usr/local/bin/ruby
require ‘net/ssh’
password=”real_password
username=‘real_name’
host=ARGV[0]
cmd=ARGV[1..ARGV.length-1].join(” “)

begin
#Net::SSH.start(host, username, :password=> password, :verbose => :debug ) do | session |
Net::SSH.start(host, username, :password=> password, :timeout=>3 ) do | session |
retry_count=0
session.open_channel do | channel|
channel.request_pty
channel.exec(“sudo #{cmd}”) do | ch, success|
#channel.exec(“echo ‘robert:$xxx.’ | sudo /usr/sbin/chpasswd -e”) do | ch, success|
abort “could not execute command” unless success
channel.on_data do | ch, data |
if data =~ /Password/
retry_count+=1
channel.send_data password+”\n”
else
puts data
end
end
channel.on_extended_data do |ch, type, data|
if data =~ /Password/
retry_count+=1
channel.send_data password+”\n”
end
end
channel.on_close do |ch|
puts “Error for #{host}” if retry_count > 1
end
end
end
end
rescue Exception
$stderr.print “Error: #{$!} on #{host}\n”
end
############# end of ssh_sudo.rb ###################

Del.icio.us : , , , ,

2006年08月30日

FreeBSD 5.4使用公钥进行SSH登录

Filed under: FreeBSD,SSH — blog @ 12:15

把系统调整到5.4,ssh的公钥登录始终有问题,SecureCRT生成的公钥传上去,无 效,用ssh-keygen生成的密钥对用SecureCRT也没法使用,后来google到一篇文章 说密钥格式不兼容导致,但是如何处理这种不兼容的密钥文件,却没了下文。 归根结底SecureCRT使用的是SSH2格式的公钥,而OpenSSH是使用的OpenSSH格式的 公钥。 ssh-keygen -i -f pub_keyfile 的 -i -f 选项可以把SSH2兼容格式的未加密公 钥,转换为OpenSSH兼容格式。 ssh-keygen -e -f pub_keyfile 则可以把OpenSSH格式的公钥转换为SSH2格式的。
1、修改/etc/ssh/sshd_config,设置 PubkeyAuthentication yes; AuthorizedKeysFile .ssh/authorized_keys
然后执行/etc/rc.d/sshd reload使设置生效
2、在自己的电脑上使用SecureCRT的Create Identity File按钮为自己创建一个密 钥对。假设分别保存为my_dsa_key和my_dsa_key.pub,后一个为公钥。
3、不管用什么办法,将my_dsa_key.pub上传到FreeBSD的用户目录的.ssh目录下。
4、在服务器上执行ssh-keygen -i -f my_dsa_key.pub > authorized_keys,生成 了一个新文件authorized_keys
5、在SecureCRT里面设置登录模式为PublicKey,并选择私钥作为identity file。
6、可以自动登录了。
其实上面的步骤是使用SecureCRT生成的密钥对来进行登录验证的,也可以使用ssh -keygen生成的密钥对来验证,只是生成密钥对之后,必须将格式转换成SecureCRT 使用的SSH2格式的!

Powered by WordPress