8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

通过 SSH 使用 sudo 的正确方法是什么?

Yiping Hao 2月前

169 0

我有一个脚本,它使用 sudo 在远程服务器上通过 SSH 运行另一个脚本。但是,当我输入密码时,它会显示在终端上。否则它工作正常。ssh user@server \'sudo

我有一个脚本,它使用 在远程服务器上通过 SSH 运行另一个脚本 sudo 。但是,当我输入密码时,它会显示在终端上。否则它工作正常。

ssh user@server "sudo script"

正确的做法是什么,以便我可以通过 sudo SSH 输入密码,而不会在输入时显示密码?

帖子版权声明 1、本帖标题:通过 SSH 使用 sudo 的正确方法是什么?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Yiping Hao在本站《bash》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 对我来说,寻找通过 ssh 进行 sudo 的方法的原因是,当我尝试以下方法时,它不起作用:

  • Idok 2月前 0 只看Ta
    引用 3

    另一种方法是使用 -t open for ssh

    ssh -t user@server "sudo script"
    

    查看 man ssh :

     -t      Force pseudo-tty allocation.  This can be used to execute arbi-
             trary screen-based programs on a remote machine, which can be
             very useful, e.g., when implementing menu services.  Multiple -t
             options force tty allocation, even if ssh has no local tty.
    
  • 它在这里不起作用:ssh -t localhost <<< \'sudo touch file;\' 编辑显然,重要的是您实际上将命令作为参数提供,而不是通过标准输入(事后看来这是有意义的)。

  • 无需使用 -t 选项,只需告诉 sudo 不需要终端即可完成相同的操作。在这种情况下,它会从 stdin 获取输入。有关详细信息和示例,请参阅下面的答案。

  • 请记住,使用 -t 分配伪终端将会改变命令的输出,例如 ssh -t host cat file != ssh host cat file,这对二进制文件(例如 tar 档案)很重要。

  • 我能够使用以下命令完全自动化它:

    echo pass | ssh -tt user@server "sudo script"
    

    优点:

    • 无密码提示
    • 不会在远程机器 bash 历史记录中显示密码

    关于安全性: 正如 Kurt 所说,运行此命令将在本地 bash 历史记录中显示您的密码,最好将密码保存在其他文件中,或将所有命令保存在 .sh 文件中并执行它。注意:该文件需要具有正确的权限,以便只有允许的用户才能访问它。

  • 它将出现在本地系统的 bash 历史记录中,包括密码。最好将密码存储在文件中并 cat 该文件。

  • 伙计,我知道 -t,但我没有仔细阅读手册,没有看到你可以传递两次!这就是我几个月来一直在寻找的东西!作为一项安全措施,我在运行 read -s -p \'Password:\' pw 之前简单地设置了一个密码变量,然后执行了 echo \'$pw\' | ..... 我现在把它变成了一个方便的脚本 :)。

  • 为什么不为需要运行的特定用户和命令设置无密码 sudo?这不是 SSH 问题...

  • 引用 11

    @nomen 您的解决方案也有效,但需要额外的步骤。如果我有很多没有无密码 sudo 用户的设备,我可以使用此解决方案创建自动化脚本。有时您在不属于自己的系统上工作,并且您不想或无法进行更改,有时还有其他考虑因素。

  • 关于防止密码出现在本地历史记录中,1) 如果它是脚本中的一行,那就不是问题,2) 对于交互式 shell,如果 HISTCONTROL 设置为 ignorespace 或 ignoreboth (假设为 bash,其他 shell 类似),则可以通过在命令开头使用空格来轻松避免本地历史记录。另一个安全问题是密码可能会显示在进程表中。echo 通常是 shell 内置的,因此它可能没有问题,但我宁愿使用此处字符串:<<< pass。

  • 通过 SSH 使用 Sudo 传递密码,不需要 tty:

    您可以在 ssh 上使用 sudo,而无需强制 ssh 具有伪终端(无需使用 ssh \'-t\' 开关),方法是告诉 sudo 不需要交互式密码,只需从 stdin 获取密码即可。您可以使用 sudo 上的 \'-S\' 开关来执行此操作。这会使 sudo 在 stdin 上监听密码,并在看到换行符时停止监听。

    示例 1 - 简单的远程命令

    在此示例中,我们发送一个简单的 whoami 命令:

    $ ssh user@server cat \| sudo --prompt="" -S -- whoami << EOF
    > <remote_sudo_password>
    > EOF
    root
    

    我们告诉 sudo 不要发出提示,而是从 stdin 获取输入。这使得 sudo 密码传递完全无声,因此您得到的唯一响应是来自 whoami .

    此技术的优点是允许您通过 ssh 使用 sudo 运行需要 stdin 输入的程序。这是因为 sudo 会在第一行 stdin 上消耗密码,然后让它运行的任何程序继续获取 stdin。

    示例 2 - 需要自己的 stdin 的远程命令

    在下面的例子中,远程命令 'cat' 通过 sudo 执行,并且我们通过 stdin 提供一些额外的行以供远程 cat 显示。

    $ ssh user@server cat \| sudo --prompt="" -S -- "cat" << EOF
    > <remote_sudo_password>
    > Extra line1
    > Extra line2
    > EOF
    Extra line1
    Extra line2
    

    输出表明该 <remote_sudo_password> 行正在被 sudo 使用,并且远程执行的 cat 正在显示多余的行。

    举个例子,如果你想使用 ssh 将密码传递给特权命令而不使用命令行,那么这将非常有用。比如,如果你想通过 ssh 安装远程加密容器。

    示例 3 - 挂载远程 VeraCrypt 容器

    在此示例脚本中,我们通过 sudo 远程安装 VeraCrypt 容器,无需任何额外的提示文本:

    #!/bin/sh
    ssh user@server cat \| sudo --prompt="" -S -- "veracrypt --non-interactive --stdin --keyfiles=/path/to/test.key /path/to/test.img /mnt/mountpoint" << EOF
    SudoPassword
    VeraCryptContainerPassword
    EOF
    

    需要注意的是,在上面的所有命令行示例中(除脚本之外的所有示例), << EOF 命令行上的构造将导致输入的所有内容(包括密码)都记录在 本地 计算机的 .bash_history 中。因此,强烈建议您在实际使用中完全通过脚本执行此操作,如上面的 veracrypt 示例,或者,如果在命令行上,则将密码放入文件中并通过 ssh 重定向该文件。

    示例 1a - 示例 1 无本地命令行密码

    因此,第一个例子将变成:

    $ cat text_file_with_sudo_password | ssh user@server cat \| sudo --prompt="" -S -- whoami
    root
    

    示例 2a - 示例 2 无本地命令行密码

    第二个例子将变成:

    $ cat text_file_with_sudo_password - << EOF | ssh va1der.net cat \| sudo --prompt="" -S -- cat
    > Extra line1
    > Extra line2
    > EOF
    Extra line1
    Extra line2
    

    如果您将整个密码放入脚本中,则无需将密码放在单独的文件中,因为脚本的内容不会出现在您的历史记录中。不过,如果您想允许不应看到密码的用户执行脚本,这仍然很有用。

  • 引用 14

    在 ssh 远程命令中,为什么需要执行 cat 并将结果导入 sudo?您可以直接使用 sudo 作为主要的 ssh 远程命令吗?

  • @joanpau 初始 cat 用于将用户的密码通过管道传输到另一端的 sudo。如果用户可以在没有密码的情况下运行 sudo,则不需要这样做,但我不建议进行此配置。将其通过管道传输的原因是为了防止密码显示在远程系统的命令行上。命令行并不安全,任何用户都可以通过 ps auxwww 查看每个命令行。

  • 我要求在 ssh 命令 cat \| sudo --prompt=\'\' -S.... 中使用 cat。如果 -S 强制 sudo 从 stdin 读取密码,cat 和管道是否有必要?ssh 命令可以简单地为 sudo --prompt=\'\' -S... 吗?

  • @jonpau 该 cat 命令获取 stdin 并将其通过 sudo 管道传输,以便向其传递 sudo 密码。它显示了如何安全地通过 stdin 将 sudo 密码通过 ssh 管道传输。

  • zhy 2月前 0 只看Ta
    引用 18

    假设您不想输入密码

    ssh $HOST 'echo $PASSWORD | sudo -S $COMMMAND'
    

    例子

    ssh me@localhost 'echo secret | sudo -S echo hi' # outputs 'hi'
    
  • 这非常危险,因为明文密码最终会出现在命令行上。命令行是公开的,系统上的所有其他用户和进程都可以看到。例如,非特权用户执行的“ps auxwwwww”将显示正在运行的每个进程以及运行它们的命令行。

  • 根据您的 shell 配置(bash 中的默认配置),在命令前放置一个空格会跳过将其添加到历史记录。您也可以保留 $PASSWORD 并在之前执行以空格为前缀的 `export PASSWORD=secret`。只需确保之后退出会话,不要让环境变量悬而未决。

返回
作者最近主题: