简而言之,我有一份 Jenkins 工作,需要更改用户和权限。 SSH 部分看起来像这样:
ssh -i {$id_rsa} {$user}@{$server} sudo chown -R nobody:nogroup {$root}/{$checkout_path}/
所以问题是我得到一个错误:
"Pseudo-terminal will not be allocated because stdin is not a terminal.
sudo: no tty present and no askpass program specified"
所以我尝试了 single -t,但没有用,但 double 应该可以解决问题:
ssh -i {$id_rsa} -t -t {$user}@{$server} sudo chown -R nobody:nogroup {$root}/{$checkout_path}/
所以...真正的问题是脚本出于某种原因停止在该行,然后继续运行。永远我猜。我让它运行了大约 15 分钟,无论如何都太长了。对远程服务器没有影响,而且它似乎什么也没做。
有人知道为什么会这样吗?
最佳答案
所以终于搞定了。正如我之前的评论 ( Issues with no tty present, when using Jenkins ) 中提到的,问题不直接在于调用本身。问题是 jenkins 被要求输入密码,但没有出现在输出中。
解决方案是先纠正 sudoers,然后对 call 做一个小改动(将 nobody:nogroup 替换为 nobody.nogroup):
ssh -i {$id_rsa} {$user}@{$server} sudo chown -R nobody.nogroup {$root}/{$checkout_path}/
所以实际调用应该是这样的:
ssh -i /var/opt/jenkins/.ssh/id_rsa -t jenkins@remote.server sudo chown -R nobody.nogroup /var/www/some/directory
Sudoers 现在看起来像这样:
jenkins ALL=(ALL) NOPASSWD: /bin/chown nobody.nogroup *,/bin/chown -R nobody.nogroup *
附言。我知道让 jenkins 用户在任何地方使用 sudo chown nobody.nogroup 的安全问题。另一方面,限制/var/www/* 没有任何好处,因为无论如何都很容易绕过它。所以出于安全原因,做一些完全不同的事情可能会更好......
关于linux - 使用 Jenkins 时不存在 tty 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19936351/