WebDav Access By PowerShell¶
概要¶
タイトルの通り。PowerShellを使ってのWebDavへのアクセス。
やること:PowerShellでWebDavディレクトリからのファイルダウンロード(ディレクトリへのファイルアップロード)
- 実際のコマンド
- 前提
- 解説
実際のコマンド¶
大体こんな感じ
ファイルを取得
$ cd ~\Desktop
$ Get-Credential |sv cred
$ Invoke-WebRequest -Method Get -Uri https://dav.example.com/hello.html -Credential $cred | sv response
$ [System.Text.Encoding]::UTF8.GetBytes($response.Content) | Set-Content -Encoding Byte hello.html
ファイルをアップ
$ cd ~\Desktop
$ Get-Credential |sv cred
$ Get-Content hello.html | sv $content
$ [System.Text.Encoding]::UTF8.GetBytes($content) | sv raw_content
$ Invoke-WebRequest -Method Put -Uri https://dav.example.com/hello.html -Credential $cred -Body ([Byte[]]$raw_content)
前提¶
- サーバ Apache
- 対象URI https://dav.example.com/hello.html
- エンコード BOM無しUTF8
- 認証 Basic認証
- ユーザー:user
- パスワード:password
- クライアント PowerShell 5
- OS Windows 10
解説¶
PowerShellの打ち方¶
svは変数を設定するコマンドレットSet-Valueの省略形。流れるような感じが好きなので代入じゃなくてSet-Valueを使っている
最後にPutするときキャストしているのはsvの結果作られる変数$raw_contentは型がObject[]になる。
これをBodyにすると数字の羅列が送られてしまい、バイト列として送られないのでキャストしている。
認証¶
Get-Credentialで入力するのは当然ながら前提で書いたユーザーとパスワード
WebDav側の認証はGet-Credenialで取得したのをそのままInvoke-WebRequestに渡してあげればうまくいく。すごい。
Apache側で作成したコマンドは
# htpasswd -c /etc/httpd/conf/htpasswd user
とかそんな感じ。
エンコード¶
いつも悩ましいPowerShellの文字エンコード。ざっくりおさらい
- PowerShell 5は内部的には文字列型はエンコードがUTF16とかいう奴が使われているらしい。
- PowerShell 5系まではUTF8を指定して書出するとBOM付きUTF8になる。読込はBOM無しUTMなくてもちゃんと読んでくれる。
- PowerShell 6系(.Net Core環境のPowerShell)からはBOM無しらしい。
ここら辺うまく設定してあげないとエンコードがよくわからないエンコーディングがよくわからない何かがWebDav側に作られる。ここら辺いまいち使いにくい。
(ちなみに「既存コマンド | コマンドレット」とか「コマンドレット | 既存コマンド」とかのパイプも文字コードを意識する必要があって面倒臭い)
というわけで「もうByte列で扱えばいいよね」ってことに行き着く。
Byte列にしてるのが[System.Text.Encoding]のところ。発想は出てくるけどやり方は忘れがち。
以下のサイトを参考にしました。
参考 https://www.uramiraikan.net/Works/entry-2798.html
なんかこれ調べるためにぐぐってたらロシア語のタイトルとか見つけた。
ロシア人もきっと文字エンコードで悩んでいるんだろうな。
WebDav¶
素直にPutしてあげたらファイルの更新も作成もどっちもやってくれました。
ステータスコードが更新だと「204 No Content」とか作成だと「201 Created」とかで帰ってくる。
失敗時はよくわからないので体験したら追記するかもしれない。
ディレクトリの作成もよくわからない。たぶん、MKCOLメソッドとかいう奴を使うんだろう。たぶん。
削除はたぶんDELETEメソッドだろう。そこらへんWebDavというプロトコルの知識。
参考¶
"Invoke-RestMethod"とかの文字コード https://www.uramiraikan.net/Works/entry-2798.html