我想做的是以下内容。
SSH 到远程主机。
将登录用户的authorized_keys 文件中的public_keys 附加到所有用户的.ssh/authorized_keys 文件中。
我在尝试在一行中使用密码执行 sudo & cat 时遇到了问题。有人知道如何解决这个问题吗?
我尝试实现这一目标的方法之一。
ssh -t $userHost -p $remotePort \
"for localUser in $(ls /home | grep -v $USER); \
do sudo mkdir -p /home/$localUser/.ssh && \
cat /home/$USER/.ssh/authorized_keys | sudo tee --append \
/home/$localUser/.ssh/authorized_keys > /dev/null; done"
但 sudo 命令似乎不能作为 ssh 命令使用。 sudoers 文件中的 NOPASSWD 不是一个选项。
答案1
sudo
使用密码将需要一个tty
.远程命令执行不会分配tty
给它。因此,除非您允许,否则它将无法工作NOPASSWD
。
相反,考虑在远程服务器上拥有一个强制账户,使用脚本作为 shell,脚本运行命令。使用基于密钥的身份验证登录强制账户,以避免输入两次密码,自动运行脚本。在脚本的最后一行,发出命令exit
以注销。由于这本质上是一个交互式会话,它将具有tty
并允许您输入密码,而您必须进行的击键次数保持不变。
我想不出任何其他方法,除非 sudo 中有一个我不知道的新功能
答案2
这就是我解决它的方法。
#!/bin/bash
userHost="[email protected]"
remotePort="1234"
password="password"
# Send public key to remote host
echo "Sending public key to remote host..."
cat "$HOME/.ssh/id_rsa.pub" | ssh $userHost \
-p $remotePort "cat >> ~/.ssh/authorized_keys"
# Add the public key to all users on the remote system
ssh $userHost -p $remotePort 'echo '"$password"' | sudo -S \
ls /home/ && for localUser in $(ls /home | grep -v $USER); \
do sudo mkdir -p /home/$localUser/.ssh && \
sudo touch /home/$localUser/.ssh/authorized_keys && \
sudo chown "$localUser:$localUser" /home/$localUser/.ssh/authorized_keys && \
cat /home/$USER/.ssh/authorized_keys | sudo tee \
--append /home/$localUser/.ssh/authorized_keys > /dev/null; done'
我首先使用echo '"$password"' | sudo -S ls /home/
垃圾命令从标准输入读取并将密码缓存在远程主机上。然后继续执行其余的 sudo 命令。
相当混乱的 oneliner,但无论如何这个脚本只打算在每个远程主机上运行一次。
我不喜欢这样的事实:我必须输入 SSH 密码两次,第一次将其存储在变量中,第二次继续第一次登录远程主机。