Как подключиться к IPv6-адресу с помощью библиотеки SSH.NET на C#

Я хочу подключиться через SSH к удаленной машине GNU+Linux и выполнить команду, но с IPv6-адресом. С адресом IPv4 все работает отлично.

Я работаю на Ubuntu 15.04 и использую MonoDevelop (Mono 4.0)

Вот мой пример кода с использованием библиотеки Renci SSH.NET:

SshClient sshClient = new SshClient (ipV6Address, user, pass);
sshClient.Connect ();
SshCommand sshCmd = sshClient.RunCommand (command);
sshClient.Disconnect ();

Я также пытался использовать Tamirs SshSharp и Terminal Control.

Добавление [ ] к адресу IPv6 также не сработало.

Я получаю следующее исключение:

System.Net.Sockets.SocketException: Invalid arguments
at System.Net.Sockets.Socket+SocketAsyncResult.CheckIfThrowDelayedException () [0x00000] in <filename unknown>:0  
at System.Net.Sockets.Socket.EndConnect (IAsyncResult result) [0x00000] in <filename unknown>:0 
at Renci.SshNet.Session.SocketConnect (System.String host, Int32 port) [0x00000] in <filename unknown>:0 
at Renci.SshNet.Session.Connect () [0x00000] in <filename unknown>:0 
at Renci.SshNet.BaseClient.Connect () [0x00000] in <filename unknown>:0 
at main program...

Может быть, кто-нибудь может предоставить мне пример кода (на C#) или указать библиотеку, которая четко поддерживает адреса IPv6. Библиотека должна быть бесплатной (желательно с лицензией Apache) и пригодной для коммерческого использования.

Привет Вима

ИЗМЕНИТЬ:

Придя к выводу, что мой ipAddress не имеет сетевого интерфейса, я изменил свой ipAddress на "fe80::xxxx:xxxx:xxxx:xxxx%2" (да, 2 правильный, я проверял с помощью ping6).

Кажется, это работает немного «больше», потому что исключение изменилось на:

System.ArgumentException: host
at Renci.SshNet.ConnectionInfo..ctor (System.String host, Int32 port, System.String username, ProxyTypes proxyType, System.String proxyHost, Int32 proxyPort, System.String proxyUsername, System.String proxyPassword, Renci.SshNet.AuthenticationMethod[] authenticationMethods) [0x00000] in <filename unknown>:0 
at Renci.SshNet.PasswordConnectionInfo..ctor (System.String host, Int32 port, System.String username, System.Byte[] password, ProxyTypes proxyType, System.String proxyHost, Int32 proxyPort, System.String proxyUsername, System.String proxyPassword) [0x00000] in <filename unknown>:0 
at Renci.SshNet.PasswordConnectionInfo..ctor (System.String host, Int32 port, System.String username, System.String password) [0x00000] in <filename unknown>:0 
at Renci.SshNet.SshClient..ctor (System.String host, Int32 port, System.String username, System.String password) [0x00000] in <filename unknown>:0 
at Renci.SshNet.SshClient..ctor (System.String host, System.String username, System.String password) [0x00000] in <filename unknown>:0 
at main program...

РЕШЕНО

Использование предварительного пакета SSH.NET решило мою проблему!

Спасибо @MartinPrikryl и другим ;)


person Wima    schedule 28.07.2015    source источник
comment
Какую ошибку вы получаете, когда пытаетесь использовать адрес IPv6? Простите меня за мой цинизм, но вы уверены, что ваша сеть поддерживает ipv6?   -  person pcwizz    schedule 28.07.2015
comment
Вы пытались сначала подключиться к серверу с помощью IPv6, используя SSH-клиент с графическим интерфейсом? Как из PuTTY?   -  person Martin Prikryl    schedule 28.07.2015
comment
Да, моя сеть поддерживает IPv6. Подключение по ssh из шелла работает. Извините, я забыл добавить сообщение об ошибке ^^, но я добавил его сейчас.   -  person Wima    schedule 28.07.2015
comment
Быстрый поиск выглядит релевантным msdn.microsoft.com/en-us/library/   -  person pcwizz    schedule 28.07.2015
comment
Спасибо @pcwizz Итак, ваша ссылка говорит, что она, вероятно, несовместима с ipv6, очень интересно. Я бы проголосовал за ваш комментарий, если бы у меня было достаточно репутации. Но я постараюсь не забыть это сделать :)   -  person Wima    schedule 28.07.2015
comment
Каково фактическое значение ipV6Address, которое вы пытаетесь использовать?   -  person Martin Prikryl    schedule 28.07.2015
comment
вид: ipV6Address = IPAddress.Parse(строка ipv6);   -  person Wima    schedule 28.07.2015
comment
А что такое ipv6 string?   -  person Martin Prikryl    schedule 28.07.2015
comment
это fe80::xxxx:xxxx:xxxx:xxxx, где x — шестнадцатеричное значение.   -  person Wima    schedule 28.07.2015
comment
Даже не пытайтесь использовать SharpSsh. Это мертвый проект. Не обновлялся более 8 лет!   -  person Martin Prikryl    schedule 29.07.2015


Ответы (1)


Если вы подключаетесь к локальному адресу ссылки (FE80::), вам необходимо указать имя интерфейса с помощью %, например, FE80::%eth0

Потому что у вас может быть несколько локальных адресов ссылок, и вам нужно указать вашей ОС, какой интерфейс использовать. С одноадресными адресами ОС знает из таблицы маршрутизации, какой интерфейс использовать.

person user3193469    schedule 28.07.2015
comment
Спасибо, это помогло мне немного дальше. Сейчас я использую fe80::.......%2, который работает лучше, потому что исключение изменилось на System.ArgumentException: host . Я опишу полное сообщение об ошибке в своем основном посте. - person Wima; 29.07.2015
comment
@Wima На самом деле это работает еще хуже, поскольку IP даже не проходит последнюю проверку в SSH.NET ConnectionInfo. Во всяком случае, я не получаю никаких исключений при передаче аргумента fe80::2e0:dff:fe9d:307%2 в host конструктора SshClient. Какую версию SSH.NET вы используете? В прошлых версиях SSH.NET действительно существовала какая-то регулярная проверка IP-адреса, которая не принимала имя интерфейса. Но его уже нет (последняя версия 2014.4.6-beta2). - person Martin Prikryl; 29.07.2015
comment
Я использую версию 2013.4.7 SSH.NET. - person Wima; 29.07.2015
comment
Ну, вам нужно обновить! - person Martin Prikryl; 29.07.2015
comment
@MartinPrikryl Большое спасибо, сэр, что решили мою проблему. Я проголосую за вас, когда наберу достаточно репутации! - person Wima; 29.07.2015
comment
@Wima Добро пожаловать. Голосовать не за что, это не мой ответ. - person Martin Prikryl; 29.07.2015