Преобразование сценария WinSCP в код C # с использованием сборки WinSCP .NET

Я загружал файлы с внешнего сервера с помощью WinSCP более года, автоматически запуская внешние сценарии из моего кода C # при ежедневном выполнении задачи.

Я недавно обновился до версии 5.5.6 (с V4.3.5.1463), чтобы я мог использовать библиотеку .NET для этого и для новой задачи SFTP для другого сервера. Задача SFTP на новом сервере очень хорошо работает с библиотекой .NET. Я очень доволен этим, но старый код скрипта теперь дает сбой.

Я пробовал добавить код .NET только для входа в систему и получения списка файлов, и это тоже не удалось. Однако, если я запустил пользовательский интерфейс winscp напрямую, я смогу увидеть файлы на сервере и загрузить их. В коде я использовал те же детали, что и в пользовательском интерфейсе, включая ключ. Код, очевидно, подключается к серверу, и ключ подтвержден, но затем не может пройти аутентификацию! Кто-нибудь может помочь?

Примечания: Я скопировал winscp.exe в ту же папку, что и библиотека .NET. Моя учетная запись не требует пароля.

Я также создал файл журнала, следует ...

Обратите внимание: в целях безопасности в этом журнале я изменил свое имя пользователя, IP-адрес подключения и ключ.

. 2015-01-19 14:24:00.757 --------------------------------------------------------------------------
. 2015-01-19 14:24:00.757 WinSCP Version 5.5.6 (Build 4746) (OS 6.1.7601 Service Pack 1 - Windows Server 2008 R2 Standard)
. 2015-01-19 14:24:00.757 Configuration: nul
. 2015-01-19 14:24:00.757 Local account: SERVER\admin
. 2015-01-19 14:24:00.757 Working directory: C:\Users\admin\Desktop\Debug\Debug
. 2015-01-19 14:24:00.757 Process ID: 4444
. 2015-01-19 14:24:00.757 Command-line: "C:\Users\admin\Desktop\Debug\Debug\winscp.exe" /xmllog="C:\Users\admin\AppData\Local\Temp

\2\wscp0B6C.01408C35.tmp" /xmlgroups /nointeractiveinput /dotnet=556  /ini=nul /log="C:\mylet\website\Temp\WinScpLog.txt"  /console 

/consoleinstance=_2924_54848996_804
. 2015-01-19 14:24:00.757 Time zone: Current: GMT+0, Standard: GMT+0 (GMT Standard Time), DST: GMT+1 (GMT Daylight Time), DST Start: 

29/03/2015, DST End: 25/10/2015
. 2015-01-19 14:24:00.757 Login time: 19 January 2015 14:24:00
. 2015-01-19 14:24:00.757 --------------------------------------------------------------------------
. 2015-01-19 14:24:00.757 Script: Retrospectively logging previous script records:
> 2015-01-19 14:24:00.757 Script: option batch on
< 2015-01-19 14:24:00.757 Script: batch           on        
> 2015-01-19 14:24:00.757 Script: option confirm off
< 2015-01-19 14:24:00.757 Script: confirm         off       
> 2015-01-19 14:24:00.757 Script: open -hostkey="ssh-dss 1024 aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa" -timeout=15 

"sftp://[email protected]:22"
. 2015-01-19 14:24:00.757 --------------------------------------------------------------------------
. 2015-01-19 14:24:00.757 Session name: [email protected] (Ad-Hoc site)
. 2015-01-19 14:24:00.757 Host name: 1.1.1.1 (Port: 22)
. 2015-01-19 14:24:00.757 User name: user (Password: No, Key file: No)
. 2015-01-19 14:24:00.757 Tunnel: No
. 2015-01-19 14:24:00.757 Transfer Protocol: SFTP
. 2015-01-19 14:24:00.757 Ping type: -, Ping interval: 30 sec; Timeout: 15 sec
. 2015-01-19 14:24:00.757 Proxy: none
. 2015-01-19 14:24:00.757 Send buffer: 262144
. 2015-01-19 14:24:00.757 SSH protocol version: 2; Compression: No
. 2015-01-19 14:24:00.757 Bypass authentication: No
. 2015-01-19 14:24:00.757 Try agent: Yes; Agent forwarding: No; TIS/CryptoCard: No; KI: Yes; GSSAPI: No
. 2015-01-19 14:24:00.757 Ciphers: aes,blowfish,3des,WARN,arcfour,des; Ssh2DES: No
. 2015-01-19 14:24:00.757 SSH Bugs: A,A,A,A,A,A,A,A,A,A
. 2015-01-19 14:24:00.757 Simple channel: Yes
. 2015-01-19 14:24:00.757 Return code variable: Autodetect; Lookup user groups: A
. 2015-01-19 14:24:00.757 Shell: default
. 2015-01-19 14:24:00.757 EOL: 0, UTF: 2
. 2015-01-19 14:24:00.757 Clear aliases: Yes, Unset nat.vars: Yes, Resolve symlinks: Yes
. 2015-01-19 14:24:00.757 LS: ls -la, Ign LS warn: Yes, Scp1 Comp: No
. 2015-01-19 14:24:00.757 Local directory: default, Remote directory: home, Update: Yes, Cache: Yes
. 2015-01-19 14:24:00.757 Cache directory changes: Yes, Permanent: Yes
. 2015-01-19 14:24:00.757 DST mode: 1; Timezone offset: 0h 0m
. 2015-01-19 14:24:00.757 --------------------------------------------------------------------------
. 2015-01-19 14:24:00.757 Looking up host "1.1.1.1"
. 2015-01-19 14:24:00.757 Connecting to 1.1.1.1 port 22
. 2015-01-19 14:24:00.804 Server version: SSH-2.0-0.0
. 2015-01-19 14:24:00.804 Using SSH protocol version 2
. 2015-01-19 14:24:00.804 We claim version: SSH-2.0-WinSCP_release_5.5.6
. 2015-01-19 14:24:00.819 Doing Diffie-Hellman group exchange
. 2015-01-19 14:24:01.053 Doing Diffie-Hellman key exchange with hash SHA-1
. 2015-01-19 14:24:01.365 Verifying host key dss 0x91486c77af8989ad 094f4a206efd983a ceeaae78321795b5 db1bf3a553007097 e1c8a86c09b41f62 

d93ca9af3dc8b5bd c10b6effc00da737 460fd7cea6c9491c 805ed7e13fbd423f 6ec239a74e66c8ff 16a199166f7076d8 f4e2874eeaf66f6c 6ba4d53436e4fed4 

68f44d7062052513 51f4eefc6e64c9f9 42e1fd1dc4c693f1 ,0x952e1dd3f13c9c9c e5d3fe2c7c96c137 173db4c9,0x88fc0112369215b4 0f4c670c3801f5e7 

08cbe3a8110c33f4 d6e6bf4880e8baa0 b1f0064f3808ebbc 286727e38bd4737f 32a67cb19b2851cc 58a87fd7166fdd0d 2524be55588b40a2 f78bba20c6db1049 

5b36125b0a1a9c94 31ce3c64a23cd028 94624932d350bb4c 056649e7ba10a807 f82037d5a4993340 3f511e923d1e031,0x2499ade72a6348f8 0919ccb5e56c68fd 

297191be353b28b7 4a7b5d55d461486d 8b86d0696617a74a a4055e1cf15baa2e 54afbb40223a6f7e 4500d7649bf51410 39a84eb81023d550 4bbd7cea6d4eb8f7 

8244bd3e8fa48387 90390b3cf3dd60a7 c45a6ddd967a8165 cf01da8309042e84 62eb7d511dd00348 ce127fdbc371d3c5  with fingerprint ssh-dss 1024 

92:ee:83:c2:30:33:de:f4:51:f2:c9:3f:ae:cd:91:9c
. 2015-01-19 14:24:01.365 Host key matches configured key
. 2015-01-19 14:24:01.365 Host key fingerprint is:
. 2015-01-19 14:24:01.365 ssh-dss 1024 aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa
. 2015-01-19 14:24:01.365 Initialised AES-256 SDCTR client->server encryption
. 2015-01-19 14:24:01.365 Initialised HMAC-SHA1 client->server MAC algorithm
. 2015-01-19 14:24:01.365 Initialised AES-256 SDCTR server->client encryption
. 2015-01-19 14:24:01.365 Initialised HMAC-SHA1 server->client MAC algorithm
! 2015-01-19 14:24:01.553 Using username "user".
. 2015-01-19 14:24:01.584 Prompt (7, SSH password, , &Password: )
. 2015-01-19 14:24:01.584 Disconnected: Unable to authenticate

Вот мой код на C #:

SessionOptions sessionOptions = new SessionOptions
{
   Protocol = Protocol.Sftp,
   HostName = "1.1.1.1",
   PortNumber = 22,
   UserName = "user",
   SshHostKeyFingerprint = "ssh-dss 1024 aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa"
};

using (Session session = new Session())
{
   session.Open(sessionOptions); // the failure happens on this line
}

person MisterT    schedule 19.01.2015    source источник


Ответы (2)


Большое спасибо Мартину за то, что он напомнил мне, что я изначально настроил вызовы этого сервера с использованием закрытого ключа, который я сохранил в файле, и, должно быть, настроил пользовательский интерфейс WinSCP, чтобы он смотрел на него (я забыл).

Я нашел файл на диске и добавил ссылку на него в SessionOptions:

SessionOptions sessionOptions = new SessionOptions
{
    ...
    SshPrivateKeyPath = @"C:\Files\myPrivateKey.ppk"
}

Мой код dotnet теперь работает, поэтому я собираюсь отказаться от сценария и использовать более аккуратный код dotnet, как я и собирался сделать с этим обновлением.

person MisterT    schedule 20.01.2015

Трудно сказать, в чем разница с 4.3.5, поскольку вы не предоставили ни журнала этой версии, ни исходного сценария.

В любом случае, если я правильно понимаю ваш пост, вы используете аутентификацию с открытым ключом в графическом интерфейсе WinSCP. Но в вашем .NET-коде не указан ключ, что, вероятно, является причиной сбоя аутентификации (не указаны ни закрытый ключ, ни пароль, следовательно, нет способа аутентификации).

Убедитесь, что вы установили путь к своему файлу закрытого ключа с помощью SessionOptions.SshPrivateKeyPath.

По поводу «ключ подтвержден». Это открытый ключ сервера. Убедитесь, что вы понимаете разницу между пара ключей сервера, используемая для проверки подлинности сервера, и ваша пара ключей, используемая для аутентификации.

person Martin Prikryl    schedule 19.01.2015
comment
Спасибо за ваш ответ. Лога от предыдущей версии у меня не было. Я просто создал журнал, чтобы попытаться отследить эту проблему. В моем коде dotnet указан ключ. Вы можете увидеть это в журнале, замененное в целях безопасности на: ssh-dss 1024 aa: aa: aa: aa: aa: aa: aa: aa: aa: aa: aa: aa: aa: aa: aa: аа Когда я звонил со сценарием, он использовал ключ, который был сохранен с графическим интерфейсом (когда вы впервые подключаетесь к графическому интерфейсу, он спрашивает, хотите ли вы сохранить ключ, я сказал да). Как я уже сказал, для скрипта я не менял скрипт во время обновления, только exe. - person MisterT; 20.01.2015
comment
Опять же, ssh-dss ... это открытый ключ сервера. Для аутентификации вам нужен не ваш закрытый ключ. Ваш код не предоставляет НИКАКОЙ информации, которая может быть использована для аутентификации. Можете ли вы хотя бы поделиться своим исходным файлом сценария? - person Martin Prikryl; 20.01.2015
comment
Оригинальный файл скрипта, пожалуйста (начиная с 4.3.5). И вообще, видя ваш код, вы не устанавливаете ни Password, ни SshPrivateKeyPath. Такой сеанс может открыться только в том случае, если сервер / учетная запись не требует аутентификации, что маловероятно. - person Martin Prikryl; 20.01.2015
comment
Спасибо, Мартин. Вы вспомнили смутное воспоминание о том, когда я впервые настроил наши вызовы на сервер несколько лет назад. Теперь у меня все работает. Я добавлю детали к ответу и отмечу Q как ответ. Спасибо еще раз. Вы сэкономили мне столько часов. - person MisterT; 20.01.2015