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

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

ただいまの
回答率

87.60%

VisualStudio2017のビルドイベントでSCPコマンド実行に失敗する

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,966

score 7

前提・実現したいこと

下記環境環境化でSCPコマンドが実行できず困っています。
PATH環境変数内容出力した際に"C:\WINDOWS\System32\OpenSSH\;"が含まれているのでパスは通ると思うのですが。。

+ OS : Microsoft Windows 10 Pro [Version 10.0.17134.523]
+ IDE : Visual Studio Community 2017 [Version 15.9.2]
+ ソリューション種類 : ターゲットフレームワーク.NETCore2.1のASP.NETCoreWebアプリケーション(RazorPage)
+ ビルドイベント種類 : ビルド後イベントのコマンドライン
+ ビルド後イベントの実行タイミング : ビルドが成功したとき

該当のソースコード

ビルドイベント

"$(SolutionDir)deploy.bat"

deploy.bat

"" > path_result.txt
PATH >> path_result.txt

"" > scp_result.txt
scp 2>> scp_result.txt

期待する結果

path_result.txt

(省略)

scp_result.txt

usage: scp [-346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
           [-l limit] [-o ssh_option] [-P port] [-S program] source ... target

実際の結果

path_result.txt

PATH=C:\ProgramData\Oracle\Java\javapath;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\OpenCL SDK\3.0\bin\x86;C:\Program Files (x86)\Intel\OpenCL SDK\3.0\bin\x64;C:\ProgramData\Lenovo\ReadyApps;C:\Program Files\EmEditor;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;C:\Program Files\TortoiseSVN\bin;C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn\;C:\Program Files (x86)\Microsoft SQL Server\120\Tools\Binn\ManagementStudio\;C:\Program Files (x86)\Microsoft SQL Server\120\Tools\Binn\;C:\Program Files\Microsoft SQL Server\120\Tools\Binn\;C:\Program Files (x86)\Microsoft SQL Server\120\DTS\Binn\;C:\Program Files\Microsoft SQL Server\120\DTS\Binn\;C:\Java\jdk1.8.0_25\bin\;C:\play-2.2.5\;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\;C:\Program Files (x86)\Microsoft SDKs\TypeScript\1.4\;C:\Program Files (x86)\Microsoft SDKs\TypeScript\1.0\;C:\Program Files (x86)\Microsoft SDKs\TypeScript\1.1\;C:\Program Files\Microsoft\Web Platform Installer\;C:\Program Files (x86)\Common Files\Acronis\SnapAPI\;C:\Program Files (x86)\EaseUS\Todo Backup\bin;C:\Program Files\Microsoft SQL Server\130\Tools\Binn\;C:\Program Files\Git LFS;C:\Program Files (x86)\Microsoft SQL Server\110\DTS\Binn\;C:\Program Files (x86)\Microsoft SQL Server\130\DTS\Binn\;C:\Program Files (x86)\GtkSharp\2.12\bin;C:\Program Files\dotnet\;C:\nodejs\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\Microsoft VS Code\bin;C:\Go\bin;C:\Program Files\Git\cmd;C:\Users\Hoo\.dnx\bin;C:\Program Files (x86)\Git\bin;C:\nuget\;C:\Program Files\EmEditor;C:\Program Files (x86)\Microsoft VS Code\bin;C:\Users\Hoo\AppData\Local\Microsoft\WindowsApps;Z:\src\go\bin;C:\Users\Hoo\AppData\Roaming\npm;Z:\src\go\bin;C:\Users\Hoo\.dotnet\x64;C:\Users\Hoo\.dotnet\tools;C:\Program Files (x86)\EaseUS\Todo Backup\bin\x64\

scp_result.txt

'scp' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

他に試したこと

+ 直接deploy.batを実行したところ、出力内容が期待する結果となりました。
+ dirの出力結果をファイルに書き出すようにdeploy.batを変更し、VSのリビルドするとフォルダ内容がファイルに出力されました。
+ sshのエラー出力結果をファイルに書き出すようにdeploy.batを変更し、VSのリビルドするとscpの時と同じ結果になりました。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

WOW64のせいでリダイレクトされてsystem32配下を見ていないのではないですかね?
VisualStudioは32ビットアプリなので、system32配下をアクセスしようとするとsyswow64にアクセスすることになるのではないかと思います。
そこで、syswow64にOpenSSHフォルダがない為にエラーになっているのではないでしょうか
32ビット版のものをインストールできるのであれば、インストールしたらsyswow64フォルダにインストールされるのではないかと思います。
(実験できる環境にないので想像です)
そうすれば、ビルドイベントからscpが使えるのではないかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/22 16:35

    これです!なんで64/32の考えに行きつかなっかんだろう…。

    とはいえ、Windows10の1803以降で標準で追加されたSSHを機能追加しても64ビット版しか入らないようなので、32ビット版が欲しい場合は別パッケージを用意する必要があるのかもしれません。

    この挙動がどこから来るのかという私のもやもやは晴れましたが、kon2323さんのもやもやが晴れたわけではないので、なんだか申し訳ないといいますか。

    キャンセル

  • 2019/01/22 16:43

    pathを通すときに%windir%\Sysnativeを指定すれば32ビット版を入れなくてもいけるとは思いますが
    これをパスに入れると影響が大きいと思いますので、scpを%windir%\sysnative\OpenSSH\scp
    で呼び出せばいけそうですね

    キャンセル

  • 2019/01/22 16:57

    sysnativeリダイレクトは初めて知りました。勉強になりました。
    Win10x64とVS2017で、ビルド後コマンドで実行できることを確認しました。

    #また本人そっちのけで申し訳なく。

    キャンセル

  • 2019/01/24 00:23

    YAmaGNZさん、ご回答ありがとうございます!
    こちらではまだ確認できていないのですが、lazybones2000さんから実行できた旨のコメントいただいていますので、原因はYAmaGNZご指摘の理由で間違いなさそうです。

    ※私もsysnativeリダイレクトは初めて知りました。非常に勉強になります。

    キャンセル

+1

path_result.txtでpath環境変数に入っているようには見えますが、scp_result.txtの内容からすれば、パスが通っていないということになるので、とりあえず動作すればいいのであれば、scpをフルパス指定すればいいのではないでしょうか。

その他、本題ではないかもしれませんが、提示された情報で気になる点を。

  • PATHの設定内容
    かなり長いですよね。重複する項目もあるようですので整理したほうが良いように思います。
  • deploy.batの内容
    1行目と4行目の"" >の記述は転記ミスでしょうか?
    空ファイル(に近いもの)を新規作成する意図だと思いますが、この記述通りだとすると、エラーで何も行われていないはずです。そのため、xxx_result.txtの内容は、実行する度に追記されていきます。
  • xxx_result.txtの内容
    これらのファイルは、$(SolusionDir)にあるものを確認されたのでしょうか。ビルド時の結果ではなく、バッチファイル単体で実行した結果を見ているために、切り分けが迷走しているということはないでしょうか。
    提示されたバッチファイルでは、ファイル名しか指定していないため、カレントフォルダーに出力されます。バッチファイルと同じフォルダーではありません。
    Visual Studioは軽くかじった程度でビルドイベントを設定したことがなく、今は手元に環境がないため確認できないのですが、ビルドイベント実行時のカレントフォルダーは$(SolutionDir)と同じなのでしょうか。そうでなければ、ビルド時に出力されたファイルを見ていないことになります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/22 00:14 編集

    ご回答ありがとうございます。
    また、私の情報開示に至らないところがあり、申し訳ありません。

    > path_result.txtでpath環境変数に入っているようには見えますが、scp_result.txtの内容からすれば、
    > パスが通っていないということになるので、とりあえず動作すればいいのであれば、scpをフルパス指定すればいいのではないでしょうか。
    → バッチファイルにscpをフルパス指定でビルド経由実行してみましたが、コマンド見つからないエラーになります。

    > deploy.batの内容
    > 1行目と4行目の"" >の記述は転記ミスでしょうか?
    > 空ファイル(に近いもの)を新規作成する意図だと思いますが、この記述通りだとすると、エラーで何も行われていないはずです。そのため、xxx_result.txtの内容は、実行する度に追記されていきます。
    → 毎度新規作成する意図でこのように記述しています。
    ご指摘の通り、コマンドプロンプトで実行するとエラーになりました。
    しかし、バッチファイルを直接実行すると私の意図通りに出力されます。。

    > xxx_result.txtの内容
    > これらのファイルは、$(SolusionDir)にあるものを確認されたのでしょうか。ビルド時の結果ではなく、バッチファイル単体で実行した結果を見ているために、
    > 切り分けが迷走しているということはないでしょうか。
    → バッチファイルは$(SolusionDir)に配置しています。この状態でバッチ単体実行すると期待通りの出力になり、ビルド経由実行だとコマンド見つからないエラーになります。

    > ビルドイベント実行時のカレントフォルダーは$(SolutionDir)と同じなのでしょうか。
    → はい、$(SolutionDir)と同じです。

    キャンセル

  • 2019/01/22 00:15

    手動でバッチ実行すれば必要な処理はできますので、とりあえずはこれ(その都度バッチ実行)で行くことにしました。 ありがとうございました。

    キャンセル

  • 2019/01/22 01:05

    すみません。""のくだりは私の誤認でした。コマンドがないエラーの結果をリダイレクトしていることになるので、空ファイルは作成されますよね。よく考えれば当然のことでした。(空ファイル作成の手法としてはあまりきれいではないですが)

    お力になれず申し訳ありませんでした。

    キャンセル

+1

OpenSSHを有効にし、VS2017Communityを入れて確認してみました。
なるほど、OpenSSHフォルダーがあるにも関わらず、ビルド時に見えていないのですね。

---ビルド後イベントのコマンドライン---
dir /ad C:\Windows\System32\O*
dir C:\Windows\System32\OpenSSH\scp.exe
---出力ウィンドウの表示(上記該当部分のみ)---
1>   ドライブ C のボリューム ラベルがありません。
1>   ボリューム シリアル番号は 5620-779D です
1>  
1>   C:\Windows\System32 のディレクトリ
1>  
1>  2019/01/21  15:03    <DIR>          oobe
1>  2018/07/10  18:19    <DIR>          or-IN
1>                 0 個のファイル                   0 バイト
1>                 2 個のディレクトリ  297,519,915,008 バイトの空き領域
1>  指定されたファイルが見つかりません。


この挙動、記憶の彼方に対策方法があった気がするのですが全くたどり着けません。

というわけで、きれいな解決方法ではないですが、今回はscpが実行できればいいのですから、ビルド時に参照可能な適当なフォルダー(例えば$(SolutionDir))配下にscp.exeをコピーするとかリンクを作るというのはどうでしょうか。

リンクを作る場合のサンプルを示します。
管理者のコマンドプロンプトから下記を実行すると、scp.exeのシンボリックリンクがC:\hogehoge\scp.exeとして作成されます。

mklink C:\hogehoge\scp.exe C:\Windows\System32\OpenSSH\scp.exe


ビルド時に実行されることは確認しましたが、これだけでscpが正常に実行できるのか、そもそもこの手法でいろいろなところから突っ込まれたりしないかなどは未確認です。

PS これ、プログラミングなのか…という気がしつつ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る