通过SSH远程运行脚本(Run scripts remotely via SSH)

2019-09-24 05:50发布

我需要收集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没有互动这个脚本?

Answer 1:

既然你需要登录到远程机器有AFAICT做没有办法这个“不使用SSH”。 然而, ssh接受命令到一次记录在(而不是它会启动shell)在远程机器上执行。 所以,如果你可以保存在远程机器,例如作为你的脚本~/script.sh ,您可以在不开始一个交互的shell执行它

$ ssh remote_machine ~/script.sh

一旦脚本终止连接将被自动关闭(如果未配置远故意)。



Answer 2:

听起来像是东西,你可以使用预期的那样。

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

想到的是,“会谈”,与其它交互式程序按照一个脚本程序。 继剧本,期望知道能够从程序进行预期,正确的反应应该是什么。



Answer 3:

如果你有每台机器上的一个键,并且可以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

(相同的结果。)



Answer 4:

SSH remoteserver.example /斌/庆典<localscript.bash



Answer 5:

(注:“正确”的方式没有密码手动输入验证是使用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


Answer 6:

也许你想尝试的期望命令如下

#!/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



文章来源: Run scripts remotely via SSH