有没有办法通过脚本以不同的用户身份通过​​ SSH/SCP 连接到另一台服务器?

有没有办法通过脚本以不同的用户身份通过​​ SSH/SCP 连接到另一台服务器?

我需要一种自动化的方法将文件分发到多台服务器。当然,问题是我需要使用安全协议(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

好的-我最终按如下方式完成了这项工作:

  1. 在所有服务器上执行 ssh-keygen。
  2. 使用每个用户的公钥为他们设置授权文件。
  3. 使用私钥为每个用户设置身份文件
  4. 将目标服务器的私钥作为唯一文件 (b_dev_id_dsa_2048_a、c_test_id_dsa_a ......) 复制到您想要通过 ssh 连接的服务器
  5. 在主机a上按如下方式调用ssh:ssh -i b_dev_id_dsa_2048_a b_dev@b

瞧,它终于成功了。

感谢大家的帮助,最后感谢 niXar 提供的最后一个 Homer Simpson DUH 时刻,因为如果用户在所有主机上都是相同的,那么这样做与您所做的完全相反。

相关内容