質問するログイン新規登録
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

474閲覧

SSH接続したArmadillo-IoT G3からファイルをダウンロードしたい

keiko-502

総合スコア3

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/07/12 09:41

0

0

実現したいこと

VS codeを使用し,python flaskにて以下のような動作をさせるWebアプリを作成しています。

1.SORACOM APIでArmadilloをリモートアクセス可能にする
2.WebアプリからSSHログイン、Armadillo側のファイル一覧情報等を取得
3.WebアプリからSCPコマンド実行しArmadilloからファイルをダウンロード
4.クライアントPCにはブラウザーの機能でファイル(txt/csv)をダウンロードしてエディタ編集し、
クライアントPCからWebアプリへのファイルアップロード機能を作ってアップロードする
5.WebアプリからSCPコマンド実行しArmadilloへ編集したファイルをアップロード

今のところ,2.まで確認できており,3.でWebアプリからSCPコマンド実行しArmadilloからファイルをクライアントPCにダウンロードするところで行き詰っている状態です。
コマンドの実行はHTMLで作成したボタンで実行するようにしています。

以下のようにソースコードを記述し,アプリをrunさせ,web画面でボタンを押してダウンロードを行うとアプリをrunしているサーバーPCにファイルがダウンロードされますが,これをクライアントPCにダウンロードするにはどうすればよいのでしょうか。


def File_download():
# ファイルパス
remote_path = 'atmark@12-345-67-89.napter.soracom.io:/home/atmark/test.txt'
local_path = r"\Users\ユーザー\Desktop"
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(atmark@12-345-67-89.napter.soracom.io, port=12345, username='atmark', password='password')
result = subprocess.run(["scp", "-P", '12345', remote_path, file_dir], capture_output=True)
ssh.close()
return send_file('C:/Users/ユーザー/Desktop/test.txt',as_attachment=True)


また,ファイルをダウンロードする際,Are you sure you want to continue connecting (yes/no/[fingerprint])?への回答と
Armadilloのパスワード入力を求められます。これを省略する方法はあるのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下のようにソースコードを記述し,アプリをrunさせ,web画面でボタンを押してダウンロードを行うとアプリをrunしているサーバーPCにファイルがダウンロードされますが,これをクライアントPCにダウンロードするにはどうすればよいのでしょうか。

send_fileを使えば送れると思いますが、C:/Users/ユーザー/Desktop/test.txtにファイルはありますか?

send_fileの使い方はここが参考になると思います。

また,ファイルをダウンロードする際,Are you sure you want to continue connecting (yes/no/[fingerprint])?への回答と
Armadilloのパスワード入力を求められます。これを省略する方法はあるのでしょうか。

試せませんが、以下あたりを参考にしたらできませんかね?

pythonで対話型ssh接続したい

paramiko でもできるような気がします。

1.SORACOM APIでArmadilloをリモートアクセス可能にする
2.WebアプリからSSHログイン、Armadillo側のファイル一覧情報等を取得
3.WebアプリからSCPコマンド実行しArmadilloからファイルをダウンロード
4.クライアントPCにはブラウザーの機能でファイル(txt/csv)をダウンロードしてエディタ編集し、
クライアントPCからWebアプリへのファイルアップロード機能を作ってアップロードする
5.WebアプリからSCPコマンド実行しArmadilloへ編集したファイルをアップロード

というか、よく分かっていない状態でいきなり色々やり過ぎていませんか?

1,2は終わっているようですから触れないことにして、

3は「Webから」をやめ、また、SSHで接続は出来ていますから、
「Pythonを使ってSCPでファイルをダウンロードする」
をやってみる。
その時、「Are you sure...」が出るでしょうから、それに対応する。
その後、4のWebでファイルをDLする方法を調べる。
それが終わったら、4のアップロード機能を調べる。
その後、Pythonを使ってSCPでアップロードする。

1つずつ個別に解決して、最後に組み合わせれば解決可能な問題と思います。

2023/07/13追記

send_fileでこのサーバーPCのディレクトリを指定することでwebアプリに接続しているクライアントPCにtest.txtがダウンロードされると考えていましたが間違っているのでしょうか。

文面だけ考えると、認識の通りですが、たぶん間違っています。

以下を参照ください。

flask.send_file

path_or_file (Union[os.PathLike, str, BinaryIO]) -- The path to the file to send, relative to the current working directory if a relative path is given. Alternatively, a file-like object opened in binary mode. Make sure the file pointer is seeked to the start of the data.

訳:path_or_file (Union[os.PathLike, str, BinaryIO]) -- 送信するファイルへのパス。相対パスが与えられている場合は、現在の作業ディレクトリからの相対パス。あるいは、バイナリモードでオープンされたファイルライクオブジェクト。ファイルポインタがデータの先頭にシークされることを確認してください。

「相対パスが与えられている場合は」と訳されていますが、昔試した時はたしか、ここは相対パスかBytesIOしか設定できなかったはずです。
というか、絶対パスは期待通り動かなかったような記憶があります。
また、この相対パスは、Flaskのルートファイル(app.py)より上のフォルダだとダメだった記憶があります。(例えば、相対パスで../../みたいなのはダメだった)

そのため、SSHでDLするファイルは、Flaskのapp.pyがあるフォルダ(カレントフォルダ)より下に配置する必要があります。

Flaskのapp.pyは、Desktopでは動かしていないんでしょうか?
とりあえず、templatesの兄弟フォルダ(例えば、downloads)を作って、そこにtest.txtを置いて試して見てはどうでしょうか

投稿2023/07/12 13:58

編集2023/07/13 09:19
FiroProchainezo

総合スコア2443

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

keiko-502

2023/07/13 08:51

コメントありがとうございます。 とりあえず1つずつ解決させていただければと思います。 >C:/Users/ユーザー/Desktop/test.txtにファイルはありますか? ダウンロードを実行すると,サーバーPCのデスクトップにtest.txtが作成されます。 send_fileでこのサーバーPCのディレクトリを指定することでwebアプリに接続しているクライアントPCにtest.txtがダウンロードされると考えていましたが間違っているのでしょうか。
FiroProchainezo

2023/07/13 09:20

回答に追記しました。 実機がないので推測でしか回答できず申し訳ございません。
keiko-502

2023/07/19 01:26

ご連絡遅くなっており申し訳ございません。 ご提示いただいたサイトを参考にして,クライアントPCにファイルをダウンロードすることができました。 アップロード部分とパスワード入力の省略については,これからですが,一度自分で試してみようと思いますのでこの質問に関しては一度クローズとさせていただきたいと思います。 ご対応いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問