通过SSH远程运行脚本



我需要从100个远程服务器收集用户信息。我们有用于身份验证的公共/私钥基础架构,并且我已经配置了ssh-agent命令以转发密钥,这意味着我可以在任何服务器上登录没有密码提示符(自动登录)。

现在,我想在所有服务器上运行一个脚本来收集用户信息(我们在所有服务器上拥有多少个用户帐户)。

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

#!/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在没有互动的情况下运行此脚本?

,由于您需要登录远程计算机,因此没有办法"没有SSH"。但是,ssh接受登录后在远程计算机上执行的命令(而不是将启动的外壳)。因此,如果您可以将脚本保存在远程计算机上,例如作为~/script.sh,您可以执行它,而无需使用

启动交互式外壳
$ ssh remote_machine ~/script.sh

脚本终止连接后,该连接将自动关闭(如果您没有故意配置该连接)。

听起来像您可以使用期望做的事情。

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

期望是一个按照脚本"谈论"其他交互式程序的程序。遵循脚本,期望知道程序可以期待什么以及正确的响应应该是什么。

如果您在每台计算机上都有一个密钥,并且可以从监视主机中进行ssh remotehost,则您有收集所需信息所需的一切。

#!/bin/bash
servers=(wopr gerty mother)
fmt="%st%st%sn"
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="%st%st%sn"
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&lt;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 "$passwordr"
expect "#"
send "./$remote_side_scriptr"
expect "#"
send "cd /libr"
expect "#"
send "cat file_namer" 
expect "#"
send "exitr"
")
echo "$expect_sh"

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

安装油腻的工具:

$ sudo apt-get install putty-tools

在您的脚本中使用PSCP:

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

也许您想尝试以下的期望命令

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

期望命令将捕获"密码:",然后自动填充您的发送。

请记住,用自己的配置替换SSH_PORT,SSH_USERNAME,SSH_SERVER_HOST和YOUR_PASSWD

相关内容

  • 没有找到相关文章

最新更新