在 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
应该:
- 问我密码
- SSH 进入某处
- sudo 更改用户
- 执行一些脚本
它的作用:
它第二次要求输入密码。
它卡在输入上(没有错误消息)。
如何解决这个问题?
更新
正如@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
从标准输入读取密码。
如果您想 运行 使用此处文档执行多个命令,请参阅 。
我有这个文件:
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
应该:
- 问我密码
- SSH 进入某处
- sudo 更改用户
- 执行一些脚本
它的作用:
它第二次要求输入密码。 它卡在输入上(没有错误消息)。
如何解决这个问题?
更新
正如@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
从标准输入读取密码。
如果您想 运行 使用此处文档执行多个命令,请参阅