在 justfile 中通过 SSH 通过 sudo 以不同用户身份执行命令

Execute commands as different user via sudo over SSH in a justfile

我有这个文件:

remote:
    #!/usr/bin/env bash
    read -p 'Password:' -s password
    ssh -tt somewhere 'bash -l -s' << 'ENDSSH'
    whoami
    echo "$password" | sudo su someone 'bash -l -s' << 'ENDSUDO'
    whoami
    ENDSUDO
    ENDSSH

应该:

它的作用:

它第二次要求输入密码。 它卡在输入上(没有错误消息)。

如何解决这个问题?

更新

正如@xhienne 所建议的,这几乎可以工作,但它说,我使用了错误的密码:

remote:
    #!/usr/bin/env bash
    read -p 'Password:' -s password
    ssh -tt somewhere 'bash -l -s' << 'ENDSSH'
    sudo -S -i -u someone << ENDSUDO
    $password
    whoami
    ENDSUDO
    exit
    ENDSSH

但这确实有效:

remote:
    #!/usr/bin/env bash
    read -p 'Password:' -s password
    ssh -tt somewhere 'bash -l -s' << 'ENDSSH'
    sudo -S -i -u someone << ENDSUDO
    clear-text-password
    whoami
    ENDSUDO
    exit
    ENDSSH

更新 2

@xhienne 的回答确实有效。

echo "$password" | sudo su someone 'bash -l -s' << 'ENDSUDO'
    whoami
ENDSUDO

您正在重定向标准输入两次:

  • 一次 |
  • 第二次与 <<

试试这个:

sudo -S -i -u someone << ENDSUDO
$password
whoami
ENDSUDO

sudo -S 将从标准输入读取密码。 sudo -i 是丑陋的 sudo su bash -l 的替代品(但需要为 -u someone 正确配置 sudo

请注意,我删除了 ENDSUDO 周围的引号。小心无意的替换。如果你必须保持 ENDSUDO 引用,那么你可以试试这个:

{
    echo "$password"
    cat << 'ENDSUDO'
whoami
ENDSUDO
} | sudo -S -i -u someone

如果您只想 运行 whoami 而不是多个命令,我相信以下内容会起作用:

#!/usr/bin/env bash
read -s -p 'Password: ' password
ssh somewhere whoami
echo "$password" | ssh somewhere sudo -S -u someone whoami

-S 告诉 sudo 从标准输入读取密码。

如果您想 运行 使用此处文档执行多个命令,请参阅