我需要一种自动化的方法将文件分发到多台服务器。当然,问题是我需要使用安全协议(SSH 或 SCP),并且每台服务器上的用户名/密码都不同。
场景是我们有一台主服务器 a,上面有用户 a_prod,我们需要将更新的脚本/配置等发送到服务器 b、c、d……,这些服务器上的用户名是 b_dev、c_test、d_prod,每个用户名都有唯一的密码。
由于一些原因,用户名需要在不同的环境中保持唯一,涉及 DB2 和公司安全。
在这种情况下,共享密钥不起作用,因此我需要通过脚本传递用户名和密码。这是一个 AIX 环境,我无法安装 expect。
有任何想法吗?
下面的多个回复中提到了共享密钥:我尝试了几种方法来做到这一点,我认为主要的问题是远程用户 ID 不存在于任何其他主机上,所以我无法在我想从其进行 ssh 的主机上为他们执行 ssh-keygen,以便与主用户 (a_prod) 一起执行共享密钥实现,该用户具有多个身份,具体取决于目标主机 (b_dev、c_test_d_prod)。需要在主机 a 上为远程用户生成这些用户的私钥,然后需要将他们的公钥复制到目标主机。
答案1
“企业愚蠢” :-)
我认为 SSH/SCP 通常属于 UNIX 哲学领域。Unix 应用程序的设计者很少会故意让管理员无法轻易做出愚蠢的事情。通常会有这样的警告:“您可能不想这样做,因为……但是,如果您真的想这样做,那也没关系!”。
在脚本中向 ssh 传递密码的情况下,他们故意把这弄得很困难,因为这只是一个馊主意。
此时,我甚至不会使用 SSH。您确实需要与公司安全人员交谈,并针对这种情况提出真正的解决方案。如果他们不想使用密钥,请询问他们您应该怎么做。如果这不起作用,请告诉您的经理他们想要做的事情由于公司安全限制而无法完成。如果经理坚持要求您这样做,把它写下来,否则你就完蛋了
答案2
插入有关公司政策的标准免责声明以及为什么在此处将用户/密码放入脚本中是不好的。
但我们都在现实世界中工作,有时这样做是没有意义的。所以……有很多工具可以让你做到这一点。Shell 没有内置方法来实现这一点。对于这种性质的非常快速和粗糙的脚本,我选择的武器是 Expect。它运行起来非常容易。
#!/usr/bin/expect
set nodename "hostname"
set username "user"
set password "pass"
set prompt "your prompt on the remote system"
eval spawn ssh -x $user@$nodeaddy
set timeout 15
expect "password:" { send "$password\r" }
expect "$prompt" { send "script\r" }
exit 0
显然,这对您来说可能有用,也可能没用,但您可以从语法中看到它工作起来有多么简单。
答案3
首先要警告:小心不要为了方便而制造安全问题。Kevin 和 Kyle 提出了很好的观点。将一堆用户名/密码组合存储在文件(甚至是加密数据库)中可能是一个非常糟糕的主意,并且可能违反公司政策。
您的问题的解决方案可能是客户端证书。有关更多信息,请参阅以下文章:
答案4
好的-我最终按如下方式完成了这项工作:
- 在所有服务器上执行 ssh-keygen。
- 使用每个用户的公钥为他们设置授权文件。
- 使用私钥为每个用户设置身份文件
- 将目标服务器的私钥作为唯一文件 (b_dev_id_dsa_2048_a、c_test_id_dsa_a ......) 复制到您想要通过 ssh 连接的服务器
- 在主机a上按如下方式调用ssh:
ssh -i b_dev_id_dsa_2048_a b_dev@b
瞧,它终于成功了。
感谢大家的帮助,最后感谢 niXar 提供的最后一个 Homer Simpson DUH 时刻,因为如果用户在所有主机上都是相同的,那么这样做与您所做的完全相反。