2015-07-28 127 views
4

我想通过SSH连接到远程的GNU + Linux机器并执行命令,但使用IPv6地址。使用IPv4地址,它工作得很好。如何使用C#中的SSH.NET库连接IPv6地址

我在Ubuntu 15.04运行和使用的MonoDevelop(单声道4.0)

下面是使用Renci SSH.NET库我的示例代码:

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

我还试图用Tamirs SshSharp和终端控制。

[ ]添加到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等;)

+1

当您尝试使用IPv6地址时会出现什么错误?原谅我的玩世不恭,但你确定你的网络支持ipv6吗? – pcwizz

+0

您是否尝试首先使用GUI SSH客户端连接到使用IPv6的服务器?像来自PuTTY? –

+0

是的,我的网络支持IPv6。 通过ssh从shell进行连接正在运行。 Sry我忘了添加错误信息^^,但我现在添加了它。 – Wima

回答

2

如果您连接到一个链路本地ADRESS(FE80::)那么你需要指定一个%,如FE80 ::%的eth0

接口名称因为你可以有多个链接本地地址,你需要告诉你的操作系统使用哪个接口。使用单播地址,操作系统知道由于路由表使用了什么接口。

+0

谢谢,这对我有所帮助。我现在使用“fe80 :: .......%2”,这似乎更好,因为异常更改为“System.ArgumentException:host”。我将在我的主要文章中描述完整的错误消息 – Wima

+2

@Wima它甚至更糟,因为IP甚至没有在SSH.NET'ConnectionInfo'中获得最后的验证。无论如何,当'fe80 :: 2e0:dff:fe9d:307%2'传递给'SshClient'构造函数的'host'参数时,我没有任何异常。你使用的是什么版本的SSH.NET?在以前版本的SSH.NET中确实存在某种类型的IP地址正则表达式验证,它们不接受接口名称。但它不再存在(最新版本2014.4.6-beta2)。 –

+0

我使用SSH.NET版本2013.4.7 – Wima