SCP 権限が拒否されました: なぜ発生するのか、そしてどのように解決するのか
SCPは、SSH経由でファイルを転送するためのオープンソースツールです。Linuxやその他のサポートされているオペレーティングシステムで使用して、SSH経由でファイルを転送できます。SSH接続を使用して2つのホスト間でファイルを転送するのに使用できます。

SCPで「アクセス拒否」エラーが発生する原因はいくつか考えられます。例えば、パスの定義が間違っている場合や、書き込み権限のエラーなどが挙げられます。この記事では、このエラーの原因と解決方法について解説します。
理由: 書き込み権限がない
このエラーが発生する理由の一つは、ユーザーがファイルを書き込もうとしているホスト上の特定のディレクトリへの書き込み権限を持っていないことです。これらの権限を確認するには、「ls -l」コマンドを使用すると、書き込み権限が表示されます。

出力の最初の列の最初の4文字の中に「w」という文字があるかどうかを確認してください。もしあれば、そのディレクトリへの書き込み権限がユーザーに付与されています。あるいは、touchコマンドを使ってそのディレクトリにファイルを作成することもできます。「アクセス拒否」などのエラーが表示されなければ、書き込み権限は付与されています。
例:
SCP を使用してファイルをリモート ホストにコピーしようとしたが、書き込み権限が原因で「アクセスが拒否されました」というエラーが表示されたとします。
scp abcd.txt ユーザー@127.0.0.1:/home/abcduser/abcd.txt
解決策1: ルートアカウントを使用してファイルを転送する
このエラーを修正するには、該当ディレクトリへの書き込み権限をユーザーに付与する必要があります。そのため、root権限またはsudo権限が必要です。別の方法としては、該当ファイルをユーザーが書き込み権限を持つディレクトリにコピーすることもできます。
このようなシナリオでは、現在のユーザーに /home/abcduser への書き込み権限を与えるか、root ユーザー アカウントを使用してこのファイルをコピーする必要があります。
root ユーザーが scp を使用してファイルをコピーできるようにするには、ssh 経由の root ログインを許可する必要があります。これはセキュリティ上の理由から推奨されませんが、このようなシナリオではとにかく使用して、後で無効にすることができます。
これを行うには、リモートホスト上のテキストエディタで/etc/ssh/sshd_config にある openssh 設定ファイルを開き、PermitRootLogin のコメントを解除します。

次に、ルート アカウントを使用してリモート ホストに接続します。
次に、次のコマンドを実行します。
scp abcd.txt root@127.0.0.1:/abcduser/abcd.txt
あるいは、単純に、これでうまくいきます。
scp abcd.txt 127.0.0.1:/abcduser/abcd.txt
なぜならそれらは同一だからです。
解決策 2: ユーザーを書き込み権限グループに追加します。
Linux でユーザーがディレクトリ/ファイルに書き込めるようにするには、そのディレクトリまたはファイルを所有するグループにユーザーを追加するか、ファイルの所有者をそのユーザーにする必要があります。
この例では、リモート システムの /home/ ディレクトリで ls -l を実行して、/home/abcd を所有しているグループを調べます。
`ls -l` コマンドを実行すると、4 列目の内容が対応するディレクトリ/ファイルを所有するグループである出力が表示されます。

この例では、`abcduser`グループがディレクトリ`/home/abcduser`を所有しているので、
このコマンドをリモート システムで実行するだけです。
sudo グループ追加 ユーザー abcd
ユーザーを所属させたいグループは「abcd」であり、グループを変更したいユーザーは「user」です。
もう一度 `ls -l` コマンドを実行し、出力の最初の列の6 番目の位置に「w」という文字が表示された場合、そのグループはこのディレクトリへの書き込み権限を持っていることを意味します。
次に、コマンドを再度実行します。この場合は次のようになります。
scp abcd.txt ユーザー@somepc:/home/abcduser/abcd.txt
解決策 3: このディレクトリを所有するユーザーを使用してファイルをコピーします。
最も簡単な解決策は、このディレクトリを所有するユーザーがファイルをそこにコピーすることです。
ディレクトリに対して「ls -l」を実行するだけです。今回の場合は以下のようになります。
ls -l /ホーム/

3 列目に出力されるのは、目的のディレクトリ名に対応するディレクトリを所有するユーザーです。この場合、上のスクリーンショットに示すように、`abcduser` がディレクトリ `/home/abcduser` を所有しています。
次に、`scp` を使用してファイルをリモート ホストにコピーするときに、この特定のアカウントを使用します。
この例では、次のようにコマンドを実行します。
scp abcd.txt abcduser@127.0.0.1:/home/abcduser/abcd.txt
理由 2: リモート ホストにはそのユーザーの秘密キーがありません。
ホスト間でファイルを転送しようとすると、「scp 権限が拒否されました」(公開鍵) というエラーが表示される場合があります。
これは `ssh` の認証の問題であり、その理由は、`scp` の実行中に秘密鍵を追加しなかったことにあります。
例:
scp somefile user@127.0.0.1:/home/user/somefile.txt
ソリューション:
これに対する簡単な解決策は、`scp`コマンドを`-i`フラグ付きで実行することです。これにより、リモートホストに接続してファイルを転送したいユーザーの秘密鍵が追加されます。
そのユーザーの秘密鍵を持っていることを確認する必要があります。持っていない場合は、リモート マシンで秘密鍵を作成し、`scp` ツールが `-i` タグを使用してその秘密鍵を使用するようにする必要があります。
私たちの場合、解決策は次のようになります。
scp -i key.pem somefile user@127.0.0.1:/home/user/somefile.txt
ここで、`key.pem` はユーザー 'user' の秘密鍵ファイルです。
注:ここでは例として`127.0.0.1`をリモートホストとして使用していますが、実際の場合、リモートホストはローカルマシンではなく、リモートマシンである可能性が高いです。
コメントは締め切りました。