我需要远程确定大量计算机上安装的 FileZilla Server 版本。
我知道,如果我初始化与 FZ 服务器的 Telnet 连接,我将收到包含服务器版本的响应,然后连接将挂起,直到使用quit、Ctrl+C或终止进程终止。
我正在寻找一种方法来遍历服务器列表,与每个服务器建立 Telnet 连接,并将带有服务器版本的消息记录在文件中。如果有一种更优雅的方式来获取这些信息,我会洗耳恭听 - 但这是我能想到的最好的方式。
我尝试过寻找答案,但大多数情况下只需要检查连接(即服务器是否在线),因此测试连接等有效。
到目前为止我所拥有的:
- 使用 plink,puTTY CMD 界面(所以我有一个可编写脚本的 Telnet 客户端)
- 使用 Powershell,因为我比 Windows CMD 脚本更了解它,但我愿意接受其他语言的答案。
我的主要问题是将响应保存在某处。Plink 在连接时打开一个新会话,我一直在努力将响应保存到主脚本日志文件(或根本)
这会调用一个新的 plink 会话,但我无法让它将输出发送到文件。
MyPC>Start-Process 'plink.exe' -ArgumentList '-telnet', '$IP', '-P', '$PORT'
给了我这个:
220-FileZilla Server version 0.9.43 beta
220-written by Tim Kosse ([email protected])
220 Please visit http://sourceforge.net/projects/filezilla/
但是,下面的代码不会将该消息发送到文件。我已经尝试过使用2>
和3>
以防万一它被发送到错误流或类似的但没有喜悦 - 它总是只是创建一个空文件。
Start-Process 'plink.exe' -ArgumentList '-telnet', '$IP', '-P', '$PORT' > C:\Temp\testps2.txt
我要么错过了一些极其简单的事情,要么是原则上看起来很简单但在实践中却非常复杂的事情之一。
我的第二步是在新会话打开后(以及捕获欢迎消息后)自动关闭它们 - 但在我可以捕获欢迎消息之前,没有太多意义进一步寻找。
任何帮助或想法,不胜感激;我有点不知所措。
虽然FTP最初是基于Telnet的,但它并不是真正的“Telnet连接”。无论如何,它是一种非常通用的 ASCII-over-TCP 协议,与 Telnet 仅有一些相似之处。
(您仍然可以使用 Telnet 客户端连接到 FTP 服务器的真正原因是因为所有 Telnet 握手都是内联发生的,并且当连接到标准 23 以外的其他端口时,您的 Telnet 客户端会禁用大部分握手。)
因此,将问题视为从 TCP 服务器而不是 Telnet 服务器收集横幅会更容易,因为这样您就可以使用 .NET 提供的常规 TCP 套接字支持(所有这些都可用于 PowerShell)。换句话说,您可以完全留在 PowerShell 中(或通过 Add-Type 使用 C#,但这不是应该需要的),而不是分叉子进程。
我发现了一个 StackOverflow示例脚本,它做的事情非常相似(事实上,它处理 FTP),所以我从那里开始 – 删除“Read-Host”位;调整循环以在爆发之前收集尽可能多的可用数据(可以选择发送
QUIT`r`n
);把这一切都放在PS函数中。