连接到远程服务器并使用bash / expect切换用户

时间:2012-01-13 16:05:04

标签: bash ssh expect

第一篇文章,提前感谢任何帮助。

我对脚本编程总体上有些新意,但我设法在bash中构建了一个很好的包装器,用于收集一些变量,然后与几个远程盒子建立连接并做一些与Web统计相关的事情系统并启动一些hadoop进程。基本上是一系列繁琐的任务,我正试图自动化。 (不必要的细节完成)。

我遇到的问题是找到一种方法来有效地连接到那些删除服务器,像普通用户一样进行身份验证,然后切换用户执行各种任务。这是相关的代码:

    #!/bin/sh
    #Script's run as root. this asks for the sudoers pass
    read -p "Enter password for $SUDO_USER: " -s password
    #Defines some testing commands I want to pass to a remote box
    CMD="hostname; id; sudo su -; id; pwd;"
    #launches an expect script with some defined variables as arguments.
    /home/ME/scripts/derp.expect $SUDO_USER $definedremoteserver "$command" "$password"

现在使用了expect脚本:

    #!/usr/bin/expect
    #expect script to help with SSH connections for the urchinizer bash script
    set arg1 [lindex $argv 0]
    set arg2 [lindex $argv 1]
    set arg3 [lindex $argv 2]
    set arg4 [lindex $argv 3]
    spawn ssh -oStrictHostKeyChecking=no $arg1@$arg2 "$arg3"
    expect "password:"
    send "$arg4\r"
    interact
    expect "password"
    send "$arg4\r"
    interact

我无法确定导致失败的原因。我研究了很多,并尝试了许多代码变体。基本上当我运行它时,它需要我的通行证,我能够进行初始连接。然后脚本尝试切换用户,第二个期望失败。第一个'id'和'hostname'输出成功。当用户切换发生时,第二个期望不起作用,我只剩下密码提示。无论如何我输入了我的通行证(由于某种原因以纯文本显示)并且脚本只是挂起而没有输出第二个'id'和'pwd'命令我试图用来验证这是否正常。

如果我实际登录到该框并执行sudo -i或sudo su - 这就是密码提示符:

    [sudo] password for my.name:

所以对于第二个(不工作)期望,我尝试了一些不同的变化,但结果有些不同,但没有成功。

对不起,很长的帖子。这一直是疯狂的。我正在尝试做什么?有更聪明的方法来处理这个问题吗?有人发现任何明显的错误吗?另外,一个次要问题......通配符如何在那些期望的行中工作?

2 个答案:

答案 0 :(得分:0)

如果可以,可以使用一些脚本语言作为Perl,Python或Ruby,并使用一些SSH模块。

例如,使用Perl和Net::OpenSSH模块:

use Net::OpenSSH;

my $ssh = Net::OpenSSH->new($host, user => $user, password => $password);
my $output = $ssh->capture({stdin_data => "$sudo_password\n"},
                           'sudo', '-Sk', '-p', '', '--',
                           'ls', '/');

答案 1 :(得分:0)

您应该在OpenSSH中使用“公钥认证”而不是“密码认证”。

1:使用此命令为要登录的用户创建私钥/公钥对:

ssh-keygen -t rsa

不提供密码,选择默认路径(输入,输入,输入)。 应该为每台SSH机器(客户端和服务器)执行此操作。

2:从您要登录的每台客户端计算机上,将新的公钥文件内容复制到您喜欢的文本编辑器(记事本,gvim等)

cat ~/.ssh/id_rsa.pub

您现在应该将所有客户的公钥粘贴到编辑器中,如下所示:

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAt9sGP1PKR1XzpozHQc9ufyzOnePHCnRzUhdfSvfQTzJO28CgnHwhANdaBeOrLq5b+VOoPJFj5NquYXmJ6YikSJCwHlvfewA/5p0IkucsJLxqYQMDRhyeXb9fCk85MoNRJjAd+Cst+gI9Cwpp1ysLMDY77k/a9eT3ExkgbGd6mdtfjAlP/o/rRMcqNwp9Pdhh6kkxrM0v1ceNSTbTeO7XCLvekqtRiwjWImhQs56JVbB/RLySNKtqjbpr7Zhn1m+p6+vmBmgwF3xBBvzziYfMm/vG1ZvvGIsI3dxRDWuSZ8+o63w7Y20M9NQn4QkqV6NFjX3conBiDGtDBKain2zj6Q== dino@blackbigone
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA0JR6d9LWgvPCbvBajrbVly3cxX7ZkbH4+MUBu+ak2G5SGLbGBcwdi3JquBAT1+U/hl+TKKUUw1XjjjazdjgYCHWIguDWzmqoyT4bQN2aymNoqD35T+LWAaqwC36m95fRfJh3HSOtx7KXpsBZjvR40rg901f8ReIjBoL7G620rrsRDqaDS08Mm6TjThBrCeTYX2YzugodpUNP2evwFOBMrYw/TIcX5Lza8xRCctm8MRodsx/yvuYuZJSanVLs3Q6sJ/n9o20L8Jt1Fu1cnyxJTs9THiLOnZyrTBXvbKJymit6p3hfDpDlWtO/crNeyt0H8jJcZfiCnhQwfib2VMMqJw== erica@blackbigone

3:将文本编辑器中的ascii装甲公钥粘贴到要登录的每台SSH服务器上的〜/ .ssh / authorized_keys文件中。您必须是要登录的用户。如果文件不存在,请创建该文件。 这样,您就可以向所有使用给定公钥的用户登录您为其创建authorized_keys文件的服务器。 如果用户具有正确匹配的私钥,则登录成功。

登录远程服务器后,您可以使用sudo(必须先使用visudo命令配置/ etc / sudoers文件)才能执行其他用户的命令。 要避免sudo请求密码(因为您在/ etc / sudoers中进行了身份验证...),您必须设置NOPASSWD标志,如下所示:

%admin ALL=(ALL) NOPASSWD: ALL