ssh 到服务器并自动执行 sudo 命令并保持 shell 打开

ssh 到服务器并自动执行 sudo 命令并保持 shell 打开

我想要alias在我的本地计算机上使用本地计算机上存储的密码ssh执行目标系统sudo,但使 shell 在远程系统上保持打开状态。原因是我很懒,每次登录服务器时我不想输入很长的密码。我知道这不是最安全的做法。

现在,如果我执行以下操作,它就会起作用:

ssh -q -t $1 "echo $mypword|base64 -d|sudo -S ls; bash -l"

$1是远程系统的主机名。 mypword 是我存储在本地系统上的编码密码。这有效并使我的外壳保持打开状态。然后我可以使用 sudo 执行任何操作,因为它现在已针对该 shell 进行缓存。

我遇到的问题是,如果您对我的帐户执行 ps 和 grep,您将在进程列表中看到包含密码的编码字符串。不能有那个。有没有办法在进程列表中不显示密码的情况下完成此操作?

我努力了:

echo $mypword|ssh -q -t $1 "base64 -d|sudo -S ls -l /root;bash -l"

声音ls响起,但外壳并未保持打开状态。

答案1

通常这可以通过 来完成expect。您可以让它从环境中检索密码,将其传递给base64并恢复输出。然后生成 ssh,等待$shell 的提示,并向其发送sudo命令。当看到 sudo 的密码提示时,发送解码后的密码,然后以通常的方式在期望内继续interact。将以下内容放入文件中并使其可执行,然后使用您的主机名作为参数调用它。

#!/usr/bin/expect -f
# https://unix.stackexchange.com/a/422651/119298
log_user 0
spawn base64 -d
send $env(mypword)\n\x04
expect -nobrace -re "\n(.+)$"
close
set output $expect_out(1,string)

spawn ssh -q -t [lindex $argv 0] 
expect {$ }
send "sudo echo hi\n"
expect -nobrace -re {.sudo. password.*:}
send "$output\n"
expect "\n"
interact

答案2

由于我没有足够的声誉来发表评论。回应:

SSH 是无密码的。我的密钥存在于系统上。我只是想缓存 sudo 的密码。

您可以编辑 sudoers 文件以允许该用户帐户在该系统上具有无密码 sudo 权限

相关内容