AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 44555
Accepted
Kevin K
Kevin K
Asked: 2009-07-24 04:26:05 +0800 CST2009-07-24 04:26:05 +0800 CST 2009-07-24 04:26:05 +0800 CST

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

  • 772

我需要自动化一种将文件分发到许多服务器的方法。当然,问题是我需要使用安全协议(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上为远程用户生成,然后他们的公钥需要复制到目标主机。

ssh scp automation
  • 9 9 个回答
  • 11538 Views

9 个回答

  • Voted
  1. Kyle Brandt
    2009-07-24T04:36:45+08:002009-07-24T04:36:45+08:00

    “公司 S(愚蠢)” :-)

    SSH / SCP 通常与我认为的 UNIX 哲学领域息息相关。很少有 Unix 应用程序的设计者故意这样做,以便管理员不能轻易地做一些愚蠢的事情。通常会有这样的警告:“你可能不想这样做,因为......但是,如果你真的想,那就好!”。

    在脚本中将密码传递给 ssh 的情况下,他们故意让这变得困难,因为这真是个坏主意。

    在这一点上,我什至不会打扰 SSH。您确实需要与公司安全人员交谈,并为该场景提出真正的解决方案。如果他们不想使用密钥,请询问他们您应该怎么做。如果这不起作用,请告诉您的经理他们想要什么由于公司安全限制而无法完成。如果经理确实坚持要您这样做,请以书面形式提出,否则就是您的屁股

    • 9
  2. James
    2009-07-24T04:53:02+08:002009-07-24T04:53:02+08:00

    在此处插入有关公司政策的标准免责声明以及为什么将用户/密码放入脚本中是不好的。

    但我们都在现实世界中工作,有时这没有意义。Soo.. 有很多工具可以让你做到这一点。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
    

    显然,这可能对您有用,也可能不适用,但是您可以从语法中看出开始工作是多么简单。

    • 1
  3. Peter
    2009-07-24T05:13:24+08:002009-07-24T05:13:24+08:00

    首先是一个警告:小心不要以权宜之计的名义制造安全问题。凯文和凯尔提出了很好的观点。在一个文件(甚至是加密的数据库)中存储一堆用户名/密码组合可能是一个非常糟糕的主意,并且可能违反公司政策。

    您的问题的解决方案可能是客户端证书。有关更多信息,请参阅以下文章:

    • 设置 SSH 密钥以进行无密码访问
    • 使用 SSH 运行远程命令
    • 1
  4. Paul de Vrieze
    2009-07-24T06:36:23+08:002009-07-24T06:36:23+08:00

    假设公司政策允许公用私钥对,这并不难实现。要获得与运行 ssh(脚本)的用户不同的用户名,请使用username@host. 更难的部分是让正确的私钥工作。假设由于某种错误的安全感,每个主机都必须使用不同的密钥对(否则会更简单),您应该创建一个配置文件,告诉客户端哪个密钥对用于哪个主机(您也可以实际指定用户名在文件中)。

    对于openssh,文件看起来像

    host a_prod
        user usera
        IdentityFile ~/.ssh/keyfora_prod
    
    host b_dev
        user userb
        IdentityFile ~/.ssh/keyforb_prod
    

    等等

    请记住,此设置实际上并不更安全。如果有人可以在这台计算机上访问该用户,他可以读取所有私钥(如果事情必须安全,则不能有密码,或者您必须使用 ssh_agent 破解)以及硬编码密码。由于私钥文件没有理由存在于其他任何地方,但在该用户的 ssh 目录中(丢失时,可以轻松创建一个新密钥)从安全角度来看,拥有四个文件与拥有一个文件没有什么不同。

    • 1
  5. Best Answer
    Kevin K
    2009-07-25T04:41:59+08:002009-07-25T04:41:59+08:00

    好的 - 我终于得到了这个工作如下:

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

    和中提琴,它终于奏效了。

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

    • 1
  6. niXar
    2009-07-24T05:15:41+08:002009-07-24T05:15:41+08:00

    如果没有私钥或 Expect 或类似的东西,我看不出你怎么能自动做到这一点。有些东西必须付出。

    你确实有事情要处理,是吗?我想你没有 Perl,因为你可以使用 Expect.pm?Python?任何事物?只是普通的旧丑ksh?跟我们多说些。

    如果不允许使用编程语言,则需要手动输入通行证。在这种情况下,您可以使用:

    scp myfile b_dev@b_prod:/path/to/dest
    

    如果涉及批处理,请考虑改用 SFTP。然后,您可以使用 lftp,而不必直接从手册页输入密码:

    lftp [-d] [-e cmd] [-p port] [-u user[,pass]] [site]
    

    但是如果你不能得到期望,我怀疑你可以使用 lftp。你能?

    / 哦,我讨厌专有的 Unix 废话

    • 0
  7. Jure1873
    2009-07-24T06:43:25+08:002009-07-24T06:43:25+08:00

    这不是一个好主意,但如果你真的需要这样做,sshpass 可以帮助你:http: //sourceforge.net/projects/sshpass/

    • 0
  8. Tedd Johnson
    2009-07-24T11:52:27+08:002009-07-24T11:52:27+08:00

    我不得不做类似的事情,只是倒退。我们从一堆服务器中提取文件,我们就是这样做的。

    awk '{FS="|"; printf("rsync %s:%s %s &\n", $1, $2, $3)}' config | sh
    

    创建一个名为 config 的文件,并在其中放置要运行的行。(请注意:您需要插入一个空行开始)。

    它现在的设置方式,您将放入[email protected]|(folder on remote server)|(folder on local server)配置中,它将对两者进行同步。您将需要在 awk 命令中切换 rsync 命令以执行相反的操作。

    这适用于我们使用的 ssh-key auth。

    • 0
  9. Gerhard
    2014-02-19T06:46:23+08:002014-02-19T06:46:23+08:00

    我还建议为身份验证创建 SSH 密钥,并使用诸如 unison 或 lsyncd 之类的工具(取决于您的需要)来保持文件同步。

    如果基于密钥的身份验证不是一个选项,您可以使用“expect”(http://linux.die.net/man/1/expect)来编写脚本。期望检查定义的输出(让我们说密码问题)并与输入定义的字符串(在该示例中为密码)相关。

    但再次按照建议,我更喜欢 ssh-key 解决方案。

    • 0

相关问题

  • 在 Windows Server 2003 上通过 SSH 启动和停止 Mongrel 服务

  • 隧道 Xbox 网络流量 [关闭]

  • 自动化服务器部署

  • 为什么使用authorized_keys通过ssh自动登录不起作用?

  • 您如何优化新用户设置?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve