通过SSH远程运行脚本

我需要从100个远程服务器收集用户信息。 我们有用于身份validation的公钥/私钥基础结构,并且我configuration了ssh-agent命令来转发密钥,这意味着我可以在没有密码提示(自动login)的情况下在任何服务器上login。

现在我想在所有服务器上运行脚本来收集用户信息(在所有服务器上有多less用户帐户)。

这是我收集用户信息的脚本。

 #!/bin/bash _l="/etc/login.defs" _p="/etc/passwd" ## get mini UID limit ## l=$(grep "^UID_MIN" $_l) ## get max UID limit ## l1=$(grep "^UID_MAX" $_l) awk -F':' -v "min=${l##UID_MIN}" -v "max=${l1##UID_MAX}" '{ if ( $3 >= min && $3 <= max && $7 != "/sbin/nologin" ) print $0 }' "$_p" 

我不知道如何使用SSH运行这个脚本没有交互?

    由于您需要登录到远程机器有AFAICT没有办法做到这一点“没有SSH”。 但是, ssh接受一个命令,一旦登录就在远程机器上执行(而不是启动的shell)。 所以,如果你可以把你的脚本保存在远程机器上,例如〜/ script.sh,你可以在不启动交互式shell的情况下执行它

     $ ssh remote_machine ~/script.sh 

    一个脚本终止连接将被自动关闭(如果你没有故意配置)。

    听起来像你可以用预期做的事情。

    http://linux.die.net/man/1/expect

    期望是一个程序,根据脚本“交谈”其他交互式程序。 在脚本之后,Expect知道程序可以预期什么,以及正确的响应应该是什么。

    如果您在每台计算机上都有密钥,并且可以通过监控主机ssh remotehost远程主机,则您只需收集所需信息即可。

     #!/bin/bash servers=(wopr gerty mother) fmt="%s\t%s\t%s\n" printf "$fmt" "Host" "UIDs" "Highest" printf "$fmt" "----" "----" "-------" count='awk "END {print NR}" /etc/passwd' # avoids whitespace problems from `wc` highest="awk -F: '\$3>n&&\$3<60000{n=\$3} END{print n}' /etc/passwd" for server in ${servers[@]}; do printf "$fmt" "$server" "$(ssh "$server" "$count")" "$(ssh "$server" "$highest")" done 

    结果给我:

     $ ./doit.sh Host UIDs Highest ---- ---- ------- wopr 40 2020 gerty 37 9001 mother 32 534 

    请注意,这使得两个ssh连接到每个服务器来收集每个数据。 如果您希望更有效地做到这一点,可以将这些信息捆绑到一个稍微复杂的集合脚本中:

     #!/usr/local/bin/bash servers=(wopr gerty mother) fmt="%s\t%s\t%s\n" printf "$fmt" "Host" "UIDs" "Highest" printf "$fmt" "----" "----" "-------" gather="awk -F: '\$3>n&&\$3<60000{n=\$3} END{print NR,n}' /etc/passwd" for server in ${servers[@]}; do read count highest < <(ssh "$server" "$gather") printf "$fmt" "$server" "$count" "$highest" done 

    (相同的结果。)

    ssh remoteserver.example / bin / bash <localscript.bash

    (注意:无需手动输入密码即可进行身份验证的“正确”方法是使用SSH密钥,即使在本地脚本中也以明文存储密码是一个潜在的安全漏洞)

    你可以运行期望作为你的bash脚本的一部分。 下面是一个可以深入到现有脚本的简单示例:

     login=user IP=127.0.0.1 password='your_password' expect_sh=$(expect -c " spawn ssh $login@$IP expect \"password:\" send \"$password\r\" expect \"#\" send \"./$remote_side_script\r\" expect \"#\" send \"cd /lib\r\" expect \"#\" send \"cat file_name\r\" expect \"#\" send \"exit\r\" ") echo "$expect_sh" 

    您还可以使用pscp将文件作为脚本的一部分来回复制,因此您不需要手动提供密码作为交互的一部分:

    安装putty-tools:

     $ sudo apt-get install putty-tools 

    在脚本中使用pscp:

     pscp -scp -pw $password file_to_copy $login@$IP:$dest_dir 

    也许你想尝试下面的expect命令

     #!/usr/bin/expect set timeout 30 spawn ssh -p ssh_port -l ssh_username ssh_server_host expect "password:" send "your_passwd\r" interact 

    expect命令将会捕获“password:”,然后自动填写上面发送的密码。

    请记住,用您自己的配置替换ssh_port,ssh_username,ssh_server_host和your_passwd