我需要从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运行此脚本?
答案 0 :(得分:3)
听起来像是你可以用期待做的事情。
http://linux.die.net/man/1/expect
Expect是一个根据脚本与其他交互式程序“对话”的程序。在脚本之后,Expect知道程序可以期待什么以及正确的响应应该是什么。
答案 1 :(得分:3)
由于您需要登录远程计算机,因此AFAICT无法执行此操作“无ssh”。但是,ssh
接受登录后在远程计算机上执行的命令(而不是它将启动的shell)。因此,如果您可以将脚本保存在远程计算机上,例如如~/script.sh
,您可以在不使用
$ ssh remote_machine ~/script.sh
一旦脚本终止,连接将自动关闭(如果你没有故意配置它)。
答案 2 :(得分:2)
如果您在每台计算机上都有一个密钥,并且可以从监控主机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
(相同的结果。)
答案 3 :(得分:2)
ssh remoteserver.example / bin / bash&lt; localscript.bash
答案 4 :(得分:0)
(注意:在没有手动输入密码的情况下进行身份验证的“正确”方法是使用SSH密钥。即使在本地脚本中以明文存储密码也是一个潜在的安全漏洞)
您可以将expect作为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
答案 5 :(得分:0)
也许您想尝试使用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命令将捕获“密码:”,然后自动填写上面发送的密码。
请记住用您自己的配置替换ssh_port,ssh_username,ssh_server_host和your_passwd