我需要收集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没有互动这个脚本?
既然你需要登录到远程机器有AFAICT做没有办法这个“不使用SSH”。 然而, ssh
接受命令到一次记录在(而不是它会启动shell)在远程机器上执行。 所以,如果你可以保存在远程机器,例如作为你的脚本~/script.sh
,您可以在不开始一个交互的shell执行它
$ ssh remote_machine ~/script.sh
一旦脚本终止连接将被自动关闭(如果未配置远故意)。
听起来像是东西,你可以使用预期的那样。
http://linux.die.net/man/1/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 /斌/庆典<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来回复制文件作为脚本的一部分,所以你不需要为交互的一部分手动提供密码:
安装腻子工具:
$ 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_passwd\r"
interact
在期待命令将赶上“密码:”,然后自动通过上述填补passwd文件的发送。
请记住,你自己的配置取代ssh_port,ssh_username,ssh_server_host和your_passwd