如何使用 ssh 在远程计算机上运行 sudo 命令?

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)

我该如何解决这个错误?

Kam*_*ski 7

改变行为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。阅读我的另一个答案的“更广泛的图片”部分。


改变行为sudo

sudo建议仅依赖于sudo自身的替代解决方案:

sudo:需要终端读取密码;使用-S从标准输入读取的选项或配置askpass helper

这些都是:

  • 从标准输入读取:(sudo -S请参阅此答案);
  • 配置askpass helper:(请参阅此答案sudo -A的第二部分)。

两者都需要一个参数sudo,因此您需要更改脚本。使用这些选项中的任何一个都很容易降低安全性。强烈喜欢ssh -t请注意,一般情况下sudo可能会配置为在没有终端的情况下无法工作


归档时间:

查看次数:

16023 次

最近记录:

4 年,12 月 前