概要
SCPコマンドの使い方はなんとかわかったのでいざやってみるとpermission denied
になる。うまくデータが送れない。そんな人向けの備忘録です。
※ SORACOM Napterによるsshが前提
背景
普段から頻繁に使うわけではないけど定期的に使う。この類って一番困りませんか?
私の場合は、SCPコマンドがそれです。特にSORACOM Napterを経由してログを取ってくるみたいな操作ですね。
1年に3回あれば多いぐらいの操作なので次やるときは脳がリセットされてます。
権限の確認
送信したいファイルの所有者と送信するユーザが異なる場合、権限不足でエラーになりがちです。そんなときはchmod
コマンドによる権限変更が必要です。
# 所有者以外のユーザが送るときの権限追加の例
chmod 757 {ファイル名}
ファイルによっては実行後に権限を戻すなどの判断が必要になることもあります。
ちなみにchmod
コマンドを実行して下記のエラーが出た場合はmount
コマンドを実行するか、cp
コマンドでマウント済みのディレクトリへ移動させてからchmod
コマンドを実行しないといけないようです。
chmod: changing permissions of '{変更対象のファイルやディレクトリ名}': Read-only file system
コマンドTips
ここからはSORACOM Napterを前提としたscpコマンドを紹介します。
ファイル単位で送りたい場合のコマンド
scp -P {ポート番号} {ユーザ名}@{IPアドレス}.napter.soracom.io:{送信元ファイルパス} {送信先ファイルパス}
例) hoge.txtをDocuments配下に送る。(送信者はuser1)
scp -P 26157 user1@33-33-333-33.napter.soracom.io:/home/user1/test/hoge.txt /Users/hoge/Documents/
フォルダ単位で送りたい場合のコマンド
-r
オプションをつけてパスをディレクトリ直指定すればOK
scp -r -P {ポート番号} {ユーザ名}@{IPアドレス}.napter.soracom.io:{送信元ディレクトリパス} {送信先ディレクトリパス}
例) testディレクトリをDocuments配下に送る。(送信者はuser1)
scp -r -P 26157 user1@33-33-333-33.napter.soracom.io:/home/user1/test /Users/hoge/Documents/
ケーススタディ
consolelog配下のファイルをuser
ユーザ経由でローカルに送信したい。
consolelog配下のファイルはroot所有なのでそのままコマンドを実行してもダメです。
権限を変えようと思ってchmod
コマンドを実行したところ下記のエラーがでました。
chmod: changing permissions of 'consolelog/': Read-only file system
そこでcp
コマンドを使ってhome/user1
配下にディレクトリ毎コピーします。
cp -r consolelog /home/user1/consolelog
なお、複製先のファイルの所有者はコマンド実行者になります。例えばroot
で実行した場合は、所有者がroot
になります。(今回はroot
がコマンドを実行したとして話を進めます。)
/home/user1/consolelog
にファイルが複製されていますが、このままだとuser
はファイルを見る権限しかないのでchmod
コマンドでを実行します。今回は /home/user1/consolelog
配下の全てのファイルが対象なので /home/user1/consolelog
に移動した上で下記コマンドを実行します。
chmod -R 757 .
※ 厳密には他ユーザに対する読み込み権限だけ付与されていればいいかもです。
最後にscpコマンドを実行します。今回はフォルダ毎ダウンロードしたいので下記コマンドを実行します。
scp -r -P 26157 user@33-33-333-33.napter.soracom.io: /home/user1/consolelog /Users/hoge/Documents/