我需要自动化一种将文件分发到许多服务器的方法。当然,问题是我需要使用安全协议(SSH 或 SCP),并且每台服务器上的用户名/密码都不同。
场景是我们有一个主服务器a,用户为a_prod,我们需要将更新的脚本/配置等发送到服务器b,c,d,...,在这些服务器上,用户名是b_dev,c_test,d_prod每个都有唯一的密码。
出于几个原因,用户名在不同环境中需要是唯一的,涉及 DB2 和企业安全。
共享密钥在这种情况下不起作用,因此我需要通过脚本传递用户名和密码。这是一个AIX环境,我没有能力安装expect。
有任何想法吗?
下面的多个回复中提到了共享密钥:我尝试了几种方法来做到这一点,我认为主要问题是远程用户 ID 在任何其他主机上都不存在,所以我不能在我想通过 ssh 与具有多个身份的主用户 (a_prod) 进行共享密钥实现,具体取决于目标主机 (b_dev、c_test_d_prod)。这些用户的私钥需要在主机a上为远程用户生成,然后他们的公钥需要复制到目标主机。
“公司 S(愚蠢)” :-)
SSH / SCP 通常与我认为的 UNIX 哲学领域息息相关。很少有 Unix 应用程序的设计者故意这样做,以便管理员不能轻易地做一些愚蠢的事情。通常会有这样的警告:“你可能不想这样做,因为......但是,如果你真的想,那就好!”。
在脚本中将密码传递给 ssh 的情况下,他们故意让这变得困难,因为这真是个坏主意。
在这一点上,我什至不会打扰 SSH。您确实需要与公司安全人员交谈,并为该场景提出真正的解决方案。如果他们不想使用密钥,请询问他们您应该怎么做。如果这不起作用,请告诉您的经理他们想要什么由于公司安全限制而无法完成。如果经理确实坚持要您这样做,请以书面形式提出,否则就是您的屁股
但我们都在现实世界中工作,有时这没有意义。Soo.. 有很多工具可以让你做到这一点。Shell 没有内置的方法来完成这项工作。对于这种性质非常快速和肮脏的脚本,我选择的武器是 Expect。跑步非常容易。
显然,这可能对您有用,也可能不适用,但是您可以从语法中看出开始工作是多么简单。
首先是一个警告:小心不要以权宜之计的名义制造安全问题。凯文和凯尔提出了很好的观点。在一个文件(甚至是加密的数据库)中存储一堆用户名/密码组合可能是一个非常糟糕的主意,并且可能违反公司政策。
您的问题的解决方案可能是客户端证书。有关更多信息,请参阅以下文章:
假设公司政策允许公用私钥对,这并不难实现。要获得与运行 ssh(脚本)的用户不同的用户名,请使用
username@host
. 更难的部分是让正确的私钥工作。假设由于某种错误的安全感,每个主机都必须使用不同的密钥对(否则会更简单),您应该创建一个配置文件,告诉客户端哪个密钥对用于哪个主机(您也可以实际指定用户名在文件中)。对于openssh,文件看起来像
等等
请记住,此设置实际上并不更安全。如果有人可以在这台计算机上访问该用户,他可以读取所有私钥(如果事情必须安全,则不能有密码,或者您必须使用 ssh_agent 破解)以及硬编码密码。由于私钥文件没有理由存在于其他任何地方,但在该用户的 ssh 目录中(丢失时,可以轻松创建一个新密钥)从安全角度来看,拥有四个文件与拥有一个文件没有什么不同。
好的 - 我终于得到了这个工作如下:
ssh -i b_dev_id_dsa_2048_a b_dev@b
和中提琴,它终于奏效了。
谢谢大家的帮助,最后是 niXar 的最后一个 Homer Simpson DUH 时刻,因为如果用户在所有主机上都相同,那么这样做与你所做的完全相反。
如果没有私钥或 Expect 或类似的东西,我看不出你怎么能自动做到这一点。有些东西必须付出。
你确实有事情要处理,是吗?我想你没有 Perl,因为你可以使用 Expect.pm?Python?任何事物?只是普通的旧丑ksh?跟我们多说些。
如果不允许使用编程语言,则需要手动输入通行证。在这种情况下,您可以使用:
如果涉及批处理,请考虑改用 SFTP。然后,您可以使用 lftp,而不必直接从手册页输入密码:
但是如果你不能得到期望,我怀疑你可以使用 lftp。你能?
/ 哦,我讨厌专有的 Unix 废话
这不是一个好主意,但如果你真的需要这样做,sshpass 可以帮助你:http: //sourceforge.net/projects/sshpass/
我不得不做类似的事情,只是倒退。我们从一堆服务器中提取文件,我们就是这样做的。
创建一个名为 config 的文件,并在其中放置要运行的行。(请注意:您需要插入一个空行开始)。
它现在的设置方式,您将放入
[email protected]|(folder on remote server)|(folder on local server)
配置中,它将对两者进行同步。您将需要在 awk 命令中切换 rsync 命令以执行相反的操作。这适用于我们使用的 ssh-key auth。
我还建议为身份验证创建 SSH 密钥,并使用诸如 unison 或 lsyncd 之类的工具(取决于您的需要)来保持文件同步。
如果基于密钥的身份验证不是一个选项,您可以使用“expect”(http://linux.die.net/man/1/expect)来编写脚本。期望检查定义的输出(让我们说密码问题)并与输入定义的字符串(在该示例中为密码)相关。
但再次按照建议,我更喜欢 ssh-key 解决方案。