rez*_*eza 2 linux sudo ubuntu bash-scripting
我正在尝试在 ubuntu 主机上远程运行 shell 脚本。
我可以使用 me@host ssh 到机器上。
在远程计算机上,我可以运行 sudo 命令而无需输入密码。
我可以使用 rsh 在远程主机上运行 shell 命令
所以现在我输入 sudo 命令并收到错误
sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper
Run Code Online (Sandbox Code Playgroud)
我运行的命令如下:
ssh user@hostIPAddress "cd /opt/somewhere && sh -v -v ./install.sh"
Run Code Online (Sandbox Code Playgroud)
install.sh 包含一个需要 sudo 命令的命令
#!/bin/bash
sudo pm2 stop someprocess
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个错误?
ssh当您在没有命令的情况下运行ssh并且存在本地伪终端时,该工具会自动在远程端分配伪终端。通常,您可以通过这种方式访问交互式远程 shell,因此分配终端是正确的做法。
当您向 提供远程命令时ssh,它假定该命令不是交互式的。它不为命令提供伪终端。这发生在你的情况下,sudo找不到终端。
您可以明确告诉本地ssh在远程端分配伪终端:
-t
强制伪终端分配。这可用于在远程计算机上执行任意基于屏幕的程序,这非常有用,例如在实现菜单服务时。多个-t选项强制 tty 分配,即使ssh没有本地 tty。
(来源)
ssh -t user@hostIPAddress "cd /opt/somewhere && sh -v -v ./install.sh"
Run Code Online (Sandbox Code Playgroud)
请注意,当您执行此操作时,您无法再./install.sh在本地区分 stdout 和 stderr。阅读我的另一个答案的“更广泛的图片”部分。
sudosudo建议仅依赖于sudo自身的替代解决方案:
sudo:需要终端读取密码;使用-S从标准输入读取的选项或配置askpass helper
这些都是:
两者都需要一个参数sudo,因此您需要更改脚本。使用这些选项中的任何一个都很容易降低安全性。强烈喜欢ssh -t。请注意,一般情况下sudo可能会配置为在没有终端的情况下无法工作。
| 归档时间: |
|
| 查看次数: |
16023 次 |
| 最近记录: |