【问题标题】:How to provide password when prompted in shell script在 shell 脚本中提示时如何提供密码
【发布时间】:2020-11-30 16:11:26
【问题描述】:

我正在编写 shell 脚本来自动执行一些任务。我正在登录远程服务器并安装一些软件包。 但是要安装,我需要获得 root 访问权限。 我可以使用带有 ssh 密钥的凭据登录。 登录后,我需要切换到 root,然后它会要求输入密码。我尝试使用 echo 它仍然要求输入密码。

SCRIPT="pwd; ls; echo 'rootpass' | su -; cd ~; pwd; yum -y install <package>"

如何在提示时传递密码。 我需要保持相同的会话,所以不确定 spawn/expect/send 是否会起作用。

更新: 我尝试使用 printf 'rootpass' | ./script.sh,但它不起作用。

【问题讨论】:

  • 考虑使用 sudo 安装包
  • 用户不能成为 sudoer 的一部分,所以我们不能添加它。我们想从变量中读取它并在出现提示时将其传递。
  • 通常,您配置sudo 以便用户无需密码即可运行yum -y install(更重要的是,没有或很少其他命令)。
  • 改为查看expect
  • 安全方面,这很糟糕,非常糟糕。这意味着您必须将 root 密码存储在原始服务器上的某个位置才能将其发送到远程服务器。 sudo 是可行的方法,因为它允许您限制可以使用的命令以及保护 root 密码。

标签: bash shell ssh


【解决方案1】:

正如评论,illustrated hereexpect 是更好的选择。

pw="Password1234"

expect -f - <<-EOF
  set timeout 10

  spawn sudo yum -y install <package>
  expect "*?assword*"
  send -- "$pw\r"
  expect eof
EOF

但是,任何脚本最好直接包含密码本身,而是从外部来源(最好是保险库)获取密码。
通常,此类脚本将由Ansible 之类的工具使用ansible-community/ansible-vault 运行。只有 Ansible 拥有 Vault 密码,而 Valut 又拥有 sudo 密码。

【讨论】:

    最近更新 更多