質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python

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

Windows Server

Windows Serverとは、Microsoft社のサーバ用オペレーティングシステムの総称です。 企業内ネットワークなどで利用されるサーバ機へ導入することを想定して開発されているため高い安定性があり、 管理機能を提供するソフトウェアが多く含まれています。

Q&A

解決済

2回答

1787閲覧

PythonのSCPで空白入りのパスを指定したい

tonton32

総合スコア4

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python

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

Windows Server

Windows Serverとは、Microsoft社のサーバ用オペレーティングシステムの総称です。 企業内ネットワークなどで利用されるサーバ機へ導入することを想定して開発されているため高い安定性があり、 管理機能を提供するソフトウェアが多く含まれています。

0グッド

0クリップ

投稿2022/11/25 03:53

前提条件(環境など)

python3.8
SCPのクライアント:windows10(ここからSCPでファイルを送りたい)
SCPのサーバー:windowsserver2019(ここへSCPでファイルを送りたい)

実現したい事

ローカルのWindows環境から、windowsserver2019に対してSSH接続し、
SCPのライブラリを使用してファイルを転送したいと考えています。

・SSH接続はできています

・C直下やC直下に作成したフォルダにはSCPでファイル転送できています

・フォルダ名に空白があるフォルダへの転送がうまくいきません(今回の場合は「test blank」フォルダ)

scp.put('test_file.pdf', "C:/test/test_file.pdf") → サーバーのCのtestフォルダに保存できる

scp.put('test_file.pdf', "C:/test blank/test_file.pdf") → これではtest blankのフォルダに保存できない

Linuxサーバーの時は空白入りのパスでも問題なく転送できたのですが、
Windows特有の書き方があるものなのか調べてもわからずにおります…
どなたかおわかりの方がいらっしゃいましたらご教授お願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

確認できる環境にないので、推測が入りますが、空白が入った時のファイル名のエスケープの処理で問題が発生していると思います。

scpモジュールのデフォルトのエスケープの処理が、unix系(というか、sh)を前提としたものになっていて、細かいところは除いてざっくり言ってしまうと C:/test blank/test_file.pdf'C:/test blank/test_file.pdf' のようにシングルクォートで囲む処理になっています。
Windowsサーバーの場合、おそらくシェルが cmd.exe なのでダブルクォートでやってやらないといけないと思われます。

ちゃんとやるなら、Windowsサーバーに合わせたエスケープ処理の関数を作るのがいいんでしょうが、まじめにやるのはちょっと大変そうなので、デフォルトのエスケープ処理をoffにして (sanitize=False)、引数で渡すファイル名を手作業でエスケープしておいてやるのではどうでしょう。

python

1# ... の部分は現状の設定から持ってきてください 2#scp = SCPClient(..., sanitize=False) # 使えません 3scp = SCPClient(..., sanitize=lambda x: x) 4# ファイル名をダブルクォートで囲ったものを渡す 5scp.put('test_file.pdf', '"C:/test blank/test_file.pdf"')

追記

sanitize=False が使えるようになったものは、まだリリースされていないみたいです。確認不足ですいません。

投稿2022/11/25 10:38

編集2022/11/25 11:35
bsdfan

総合スコア4520

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

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

tonton32

2022/11/25 11:10

ご回答いただきありがとうございます。 早速いただいたプログラムで実行してみました。 Traceback (most recent call last): File "C:\Users\user\desktop\scptest.py", line 38, in <module> scp = SCPClient(..., sanitize=False) File "C:\Users\user\AppData\Local\Programs\Python\Python310\lib\site-packages\scp.py", line 156, in __init__ self.peername = self.transport.getpeername() AttributeError: 'ellipsis' object has no attribute 'getpeername' 今までとは異なるエラーに前身の気配を感じつつも、 このエラー内容で検索してもイマイチわからず… まずは状況をご報告させていただきます。
bsdfan

2022/11/25 11:13

すいません、説明不足でした。 ... の部分は今のコードをコピーしてください。
tonton32

2022/11/25 11:26

こちらこそ認識不足で申し訳ありません。 scp = SCPClient(ssh.get_transport(), sanitize=False) scp.put('test_file.pdf', 'C:/test blank/test_file.pdf') このようにして実行しました。 Traceback (most recent call last): File "C:\Users\user\desktop\scptest.py", line 39, in <module> scp.put('test_file.pdf', 'C:/test blank/test_file.pdf') File "C:\Users\user\AppData\Local\Programs\Python\Python310\lib\site-packages\scp.py", line 190, in put self.sanitize(asbytes(remote_path))) TypeError: 'bool' object is not callable このようにエラーが返ってきました。 引き続きお力添えをいただければ幸いです。
bsdfan

2022/11/25 11:34

githubにある最新のコードでは sanitize=False が使えるのですが、リリースされている最新版にはそれははいっていないようなので、lambda で代用しました。
tonton32

2022/11/25 11:53

保存できました!ありがとうございます。 検索して色々試しても全くわからず途方に暮れておりました。 度々のお力添えに深く感謝致します。本当にありがとうございました。
guest

0

再現環境なく推測ですがscp from remote Linux to local Windows with spaces in local pathと同じ現象だと思われます。
回答に記載されているいくつかの方法、パスを"'で囲むなどを試してみると解決するかもしれません。

投稿2022/11/25 08:02

can110

総合スコア38233

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

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

tonton32

2022/11/25 10:30

ご回答いただきありがとうございます。 scp.put('test_file.pdf', "C:/test\ blank/test_file.pdf")  \の部分はバックスラッシュ scp.put('test_file.pdf', "C:/test\\ blank/test_file.pdf") \の部分はバックスラッシュ scp.put('test_file.pdf', "'C:/test blank/test_file.pdf'") シングルクオーテーションで囲ってダブルクオーテーションで囲う ↑ この状態でバックスラッシュを入れてみても… scp.put('test_file.pdf', "'C:/test\ blank/test_file.pdf'") \はバックスラッシュ scp.put('test_file.pdf', "'C:/test\\ blank/test_file.pdf'") \はバックスラッシュ いずれも保存できませんでした… 他に方法をご存じでしたらぜひよろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問