Bash: 运行 远程主机上的 sudo 功能?

Bash: Running a function as sudo on remote host?

我有以下示例脚本,用于在远程主机上执行 运行 命令。

该脚本从用户输入中接受远程主机的密码,我们可以使用该密码作为该用户登录,我希望也传递给 sudo

问题是,我似乎无法使用 sudo 将第二个函数中的 运行OnRemoteHostAsRoot 函数获取到 运行 ,我需要。

如何让它工作?

两端站台为Ubuntu18或20

#!/bin/bash

read SSHPASS
export SSHPASS

runOnRemoteHost() {
    # ...
    whoami
    # ...
}
# ...
sshpass -e ssh -o PasswordAuthentication=yes "user@remotehost" "$(declare -f runOnRemoteHost); runOnRemoteHost" 2>&1
# ...


runOnRemoteHostAsRoot() {
    # ...
    whoami
    # ...
}
# ...
echo "${SSHPASS}" | sshpass -e ssh -o PasswordAuthentication=yes "user@remotehost" "$(declare -f runOnRemoteHostAsRoot); sudo --stdin runOnRemoteHostAsRoot" 2>&1
# ...

预期输出:

user
root

实际输出:

user
[sudo] password for user: sudo: runOnRemoteHostAsRoot: command not found

@Will 的建议在这种情况下很有用,使用 sudo bash -c,然后声明和 运行 函数:

sudo bash -c "$(declare -f runOnRemoteHostAsRoot); runOnRemoteHostAsRoot"

我们将在通过 sshpass 传递密码后使用该行进行无密码登录,如下所示:

echo '${SSHPASS}' | sudo --stdin bash -c '$(declare -f runOnRemoteHostAsRoot); runOnRemoteHostAsRoot'`

所以在上面的例子中使用这个:

#!/bin/bash

read SSHPASS
export SSHPASS


runOnRemoteHost() {
    # ...
    whoami
    # ...
}
# ...
sshpass -e ssh -o PasswordAuthentication=yes "user@remotehost" "$(declare -f runOnRemoteHost); runOnRemoteHost" 2>&1
# ...


runOnRemoteHostAsRoot() {
    # ...
    whoami
    # ...
}
# ...
sshpass -e ssh -o PasswordAuthentication=yes "user@remotehost" "echo '${SSHPASS}' | sudo --stdin bash -c '$(declare -f runOnRemoteHostAsRoot); runOnRemoteHostAsRoot'" 2>&1

输出:

user
root