【问题标题】:Running interactive Bash commands over ssh通过 ssh 运行交互式 Bash 命令
【发布时间】:2012-10-23 13:34:19
【问题描述】:

我正在尝试使用 chef 自动化我的服务器配置过程。由于我不想以 root 身份运行 chef,我需要一个 chef/deployer 用户。但我不想手动创建这个用户。相反,我想自动化这一步。所以我尝试编写脚本,但遇到了一个问题:

问题是,如果我运行

>ssh root@123.345.345.567 '/bin/bash -e' < ./add_user.sh

add_user 包含在哪里

//..if the username doesnt exist already
adduser $USERNAME --gecos ''

我从来没有看到命令的输出或提示。

  1. 有没有办法以这种方式运行交互式命令?
  2. 有没有更好的方式自动添加用户?

【问题讨论】:

  • echo "command" | ssh user@remote_host

标签: bash ssh chef-infra


【解决方案1】:

试试这个:

ssh -t root@<ipaddress> adduser $USERNAME --gecos

不确定为什么在原始示例中的 IP 地址中有 $ - 这可能会导致 ssh 无法连接,但由于您没有指出这种故障,我假设这是只是一个错字。

由于add_user.sh 只是一个简单的命令,因此无需显式运行bash 或重定向增加复杂性,只需通过ssh 运行adduser 命令即可。

最后,由于$USERNAME 可能定义在本地端,而不是远程端,即使您可以让原始命令“照您说的做”,您最终也会运行adduser --gecos在远端,这不是你想要的。

【讨论】:

  • 我从 IP 中删除了 $(错字)。实际上在脚本中检查了用户的预先存在。这就是它仍然是脚本的唯一原因。
【解决方案2】:

尝试使用:

ssh -t root@$123.345.345.567 '/bin/bash -e' < ./add_user.sh

改为。

【讨论】:

  • 我试过这个并得到: >> 伪终端将不会被分配,因为标准输入不是终端。所以我查了一下interwebz,发现-t -t 应该是强制的。但这只是将 shell 脚本的内容打印到终端控制台。
  • 当我用“-t -t”删除“-e”时,脚本实际上会运行,但似乎没有接受我的用户输入并继续。即使我输入了,它仍然在等待我输入某些内容。
猜你喜欢
  • 1970-01-01
  • 2015-05-20
  • 2014-04-07
  • 1970-01-01
  • 2012-07-07
  • 2021-11-14
  • 2015-02-19
  • 2017-03-18
  • 2021-08-01
相关资源
最近更新 更多