![ssh 到服务器并自动执行 sudo 命令并保持 shell 打开](https://linux22.com/image/127170/ssh%20%E5%88%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%B9%B6%E8%87%AA%E5%8A%A8%E6%89%A7%E8%A1%8C%20sudo%20%E5%91%BD%E4%BB%A4%E5%B9%B6%E4%BF%9D%E6%8C%81%20shell%20%E6%89%93%E5%BC%80.png)
我想要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 权限