
私がしたいことは次のとおりです。
リモートホストにSSHで接続します。
ログインしたユーザーのAuthorized_keysファイルにあるpublic_keysを、すべてのユーザーの.ssh/authorized_keysファイルに追加します。
1行にパスワードを使用して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
。
代わりに、スクリプトをシェルとして使用し、コマンドを実行するスクリプトを使用してリモートサーバーに強制アカウントを持つことを検討してください。キーベース認証を使用して強制アカウントにログインすると、パスワードを2回入力せずにスクリプトを自動的に実行できます。スクリプトの最後の行から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コマンドを実行し続けます。
非常に混乱しているオネライナーですが、とにかくこのスクリプトはリモートホストごとに一度だけ実行するように設計されています。
SSHパスワードを2回入力する必要があるという事実は気に入りません。 1つ目は変数に保存し、2つ目はリモートホストへの最初のログインを続行します。