キーを/root/.ssh/authorized_keysにコピーします。

キーを/root/.ssh/authorized_keysにコピーします。

以下のスクリプトを使用して、ファイル(キーを含む)をリモートシステムにコピーします。ところで、以下のようなエラーが発生します。

/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ルートファイルに書き込む権限を持たない非ルートユーザーとして発生します。

標準的な解決策は、teesudoでコマンドを使用することです。

#!/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@adasとして実行し、sudo <some parameters for sudo> >/dev/nullそのsudoコマンドはrootアクセス権を取得して実行しますtee /root/.ssh/authorized_keys

このteeコマンドは、標準入力からパイプに渡されたキーを受け取り、入力のコピーをファイルに書き込み/root/.ssh/authorized_keys(ルートとして実行されるために可能です)、別のコピーを標準出力に渡します。追加のコピーは、実行された最初のリモートシェルに返されnormal_user@adます/dev/null

関連情報