以下のスクリプトを使用して、ファイル(キーを含む)をリモートシステムにコピーします。ところで、以下のようなエラーが発生します。
/root/.ssh/authorized_keys: 権限が拒否されました。
#!/bin/bash
for i in `cat hosts`
do cat team.keys | sshpass -f pass ssh -t -o "StrictHostKeyChecking no" normal_user@ad@${i} "sudo cat >> /root/.ssh/authorized_keys";
done
- 解決策を見つけるための提案を共有してください。
答え1
sudo cat >> /root/.ssh/authorized_keys
このコマンドはあなたが思うようには機能しません。
一般ユーザーとして実行されるシェルは、コマンドの実行を開始する前にリダイレクトを実装しますsudo cat
。したがって、リダイレクトは、authorized_keys
ルートファイルに書き込む権限を持たない非ルートユーザーとして発生します。
標準的な解決策は、tee
sudoでコマンドを使用することです。
#!/bin/bash
for i in $(cat hosts)
do cat team.keys | sshpass -f pass ssh -t -o "StrictHostKeyChecking no" \
normal_user@ad@${i} "sudo tee -a /root/.ssh/authorized_keys >/dev/null"
done
このバージョンでは、asを実行しているリモートシェルはコマンドをnormal_user@ad
asとして実行し、sudo <some parameters for sudo> >/dev/null
そのsudo
コマンドはrootアクセス権を取得して実行しますtee /root/.ssh/authorized_keys
。
このtee
コマンドは、標準入力からパイプに渡されたキーを受け取り、入力のコピーをファイルに書き込み/root/.ssh/authorized_keys
(ルートとして実行されるために可能です)、別のコピーを標準出力に渡します。追加のコピーは、実行された最初のリモートシェルに返されnormal_user@ad
ます/dev/null
。