C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

scpコマンド実行できない

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■96140 / inTopicNo.1)  scpコマンド実行できない
  
□投稿者/ furu (82回)-(2020/10/23(Fri) 11:31:42)

分類:[C#] 

Windows10
VS2019 C#

コマンドプロンプトでscpコマンドが実行できます。

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

これをC#で実行するとエラーになります。

System.Diagnostics.Process.Start("scp");

System.ComponentModel.Win32Exception: '指定されたファイルが見つかりません。'

System.Diagnostics.Process.Start("cmd", "/K scp");

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

ProcessStartInfoを使ったり
いろいろやってみたりしたのですが駄目でした。

よろしくお願いします。
引用返信 編集キー/
■96141 / inTopicNo.2)  Re[1]: scpコマンド実行できない
□投稿者/ 魔界の仮面弁士 (5回)-(2020/10/23(Fri) 11:58:42)
2020/10/23(Fri) 11:59:22 編集(投稿者)

No96140 (furu さん) に返信
> コマンドプロンプトでscpコマンドが実行できます。

コマンドプロンプトで「WHERE scp」を入力して、
それで得られたフルパスを Process.Start してみては如何でしょう。
引用返信 編集キー/
■96142 / inTopicNo.3)  Re[1]: scpコマンド実行できない
□投稿者/ 774RR (839回)-(2020/10/23(Fri) 12:00:32)
コマンドプロンプトで cmd /k scp ができるか確認してみよう

あとウチの win10 だと scp は c:\WINDOWS\System32\OpenSSH\scp.exe なんだけど
このディレクトリに PATH が通っているかとか scp.exe があるかとか
そういう環境確認も同時にどうぞ

引用返信 編集キー/
■96144 / inTopicNo.4)  Re[2]: scpコマンド実行できない
□投稿者/ furu (83回)-(2020/10/23(Fri) 12:24:48)
No96141 (魔界の仮面弁士 さん) に返信
> コマンドプロンプトで「WHERE scp」を入力して、
> それで得られたフルパスを Process.Start してみては如何でしょう。
駄目でした。

No96142 (774RR さん) に返信
> コマンドプロンプトで cmd /k scp ができるか確認してみよう
できました。

> あとウチの win10 だと scp は c:\WINDOWS\System32\OpenSSH\scp.exe なんだけど
同じです。

> このディレクトリに PATH が通っているかとか scp.exe があるかとか
PATH通っていてscp.exeあります。

フルパス気になったのですが
C#が64bitの場合、64bit版のcmd.exeが起動され、
c:\WINDOWS\System32\が見えないとか実行できないとか
あるんでしょうか?
引用返信 編集キー/
■96147 / inTopicNo.5)  Re[3]: scpコマンド実行できない
□投稿者/ 魔界の仮面弁士 (2886回)-(2020/10/23(Fri) 13:16:01)
No96144 (furu さん) に返信
> C#が64bitの場合、64bit版のcmd.exeが起動され、
> c:\WINDOWS\System32\が見えないとか実行できないとか

C:\Windows\SysWOW64\Cmd.exe と
C:\Windows\System32\Cmd.exe の
どちらを呼び出していますか?


システムディレクトリの構成は
64bit 版 Windows 上の場合
 C:\Windows\System32\ … 64bit 向けの DLL
 C:\Windows\SysWOW64\ … 32bit 向けの DLL
32bit 版 Windows 上の場合
 C:\Windows\System32\ … 32bit 向けの DLL
 C:\Windows\System\  … 16bit 向けの DLL
という形になっていることはご存知ですよね。


64bit 版 Windows 上で 32bit プロセスのアプリケーションを動作させた場合、
 C:\Windows\System32\ へのアクセスは、C:\Windows\SysWOW64\ にリダイレクトされ、
 C:\Windows\SysNative\ へのアクセスは C:\Windows\System32\ にリダイレクトされます。

引用返信 編集キー/
■96148 / inTopicNo.6)  Re[4]: scpコマンド実行できない
□投稿者/ furu (85回)-(2020/10/23(Fri) 14:11:38)
No96147 (魔界の仮面弁士 さん) に返信
> C:\Windows\SysWOW64\Cmd.exe と
> C:\Windows\System32\Cmd.exe の
> どちらを呼び出していますか?
Cmdを呼び出しています。

> システムディレクトリの構成は
> 64bit 版 Windows 上の場合
>  C:\Windows\System32\ … 64bit 向けの DLL
>  C:\Windows\SysWOW64\ … 32bit 向けの DLL
> 32bit 版 Windows 上の場合
>  C:\Windows\System32\ … 32bit 向けの DLL
>  C:\Windows\System\  … 16bit 向けの DLL
> という形になっていることはご存知ですよね。
最近、困っていないので、すっかり忘れていました。

> 64bit 版 Windows 上で 32bit プロセスのアプリケーションを動作させた場合、
>  C:\Windows\System32\ へのアクセスは、C:\Windows\SysWOW64\ にリダイレクトされ、
>  C:\Windows\SysNative\ へのアクセスは C:\Windows\System32\ にリダイレクトされます。
そうなんですね。

https://sakura86.com/64bit-os-cmd/

    Windows10の場合
  Windows7の反省からか、「ファイルとプログラムの検索」から「cmd」と入力して実行した場合は
  32bit版のコマンドプロンプト(C:\Windows\System32\cmd.exe)が起動します。

64bitWin10で
普通にコマンドプロンプトを開くと
32bit版のコマンドプロンプト(C:\Windows\System32\cmd.exe)が起動し
C#からコマンドプロンプトを起動すると
64bit版のコマンドプロンプト(C:\windows\SyswWOW64\cmd.exe)が起動しているようです。

System.Diagnostics.Process.Start(@"C:\Windows\SysNative\OpenSSH\scp.exe");
System.Diagnostics.Process.Start(@"C:\Windows\SysNative\cmd.exe", "/K scp");

どちらも成功しました。

引用返信 編集キー/
■96150 / inTopicNo.7)  Re[3]: scpコマンド実行できない
□投稿者/ 魔界の仮面弁士 (2887回)-(2020/10/23(Fri) 14:43:32)
2020/10/23(Fri) 14:49:09 編集(投稿者)

No96144 (furu さん) に返信
>>このディレクトリに PATH が通っているかとか scp.exe があるかとか
> PATH通っていてscp.exeあります。

『実行プロセスに対して PATH が通っているかどうか』を、
どのようにして確認しましたか?

VS2019 をお使いとのことなので、プロジェクトのプロパティの [ビルド] タブが
  プラットフォーム ターゲット:Any CPU
  32ビットを優先:checked
の初期値設定のままになっているのではないでしょうか。

もしも Win64 版 SCP を導入していて、PATH に C:\WINDOWS\System32\OpenSSH\ が
記述されていた場合、 No96147 で述べたファイルシステムリダイレクタの働きによって
C:\WINDOWS\System32\OpenSSH\ というディレクトリ指定にて
C:\WINDOWS\SysWOW64\OpenSSH\ というフォルダーが参照されます。

Console.WriteLine(IntPtr.Size == 4 ? "32bit" : "64bit");
Console.WriteLine(System.IO.Directory.Exists(@"C:\WINDOWS\System32\OpenSSH\"));

もしも環境変数 PATH に記述があっても、それが実在するフォルダーを
指していない場合、PATH が通っていない事になってしまいます。



64bit アプリを PATH に登録し、それを 32bit プロセス/64 プロセスの
いずれからでも呼べるようにしたい場合には、mklink コマンドを用いて
32bit / 64bit それぞれのシステムフォルダーの下に対して、
任意の同名シンボリック・リンクを貼っておき、そのパスを
環境変数 PATH に記述するという手法が使えます。

http://everything-you-do-is-practice.blogspot.com/2018/01/oracle-instant-client-6432.html
https://www.atmarkit.co.jp/ait/articles/1306/07/news111.html
引用返信 編集キー/
■96154 / inTopicNo.8)  Re[4]: scpコマンド実行できない
□投稿者/ furu (86回)-(2020/10/23(Fri) 15:07:02)
No96150 (魔界の仮面弁士 さん) に返信
> ■No96144 (furu さん) に返信
> >>このディレクトリに PATH が通っているかとか scp.exe があるかとか
>>PATH通っていてscp.exeあります。
>
> 『実行プロセスに対して PATH が通っているかどうか』を、
> どのようにして確認しましたか?
PATHコマンドの結果にC:\Windows\System32\OpenSSH\が入っていた。
エクスプローラでC:\Windows\System32\OpenSSH\scp.exeが表示された。

>
> VS2019 をお使いとのことなので、プロジェクトのプロパティの [ビルド] タブが
>   プラットフォーム ターゲット:Any CPU
>   32ビットを優先:checked
> の初期値設定のままになっているのではないでしょうか。
そうです。

> 64bit アプリを PATH に登録し、それを 32bit プロセス/64 プロセスの
> いずれからでも呼べるようにしたい場合には、mklink コマンドを用いて
> 32bit / 64bit それぞれのシステムフォルダーの下に対して、
> 任意の同名シンボリック・リンクを貼っておき、そのパスを
> 環境変数 PATH に記述するという手法が使えます。
諸々ありがとうございます。

毎日コマンドプロンプトで叩いていることを
プログラムで自動化したかっただけですけど
ちょっと他にも問題があってなかなか大変そうです。

 ・パスフレーズの入力
  linuxならexceptコマンドが使える
 ・scpコマンドで全角文字を含むファイルパスが使えない
  共有ドライブ設定で対応予定

原因がわかってきたので、一旦解決済みとさせていただきます。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ