“net use”命令中的标准输入重定向不起作用

Standard input redirection in "net use" command is not working

提问人:nicolasim 提问时间:10/18/2023 更新时间:10/23/2023 访问量:59

问:

我需要从几台 Windows 计算机提供对共享主机上远程文件夹的访问权限。此托管服务为我提供SSH,并且只有一个用户帐户。无法在服务器上创建更多 SSH 用户或本地帐户。我不希望这些计算机的用户知道 SSH 密码,以避免他们对 SSH 控制台具有完全访问权限。出于同样的原因,我什至不想为他们提供不同的 SSH rsa 密钥。

因此,这是我解决此问题的方法:开发一个 .Net 应用程序,使用 WinFsp + SSHFS-Win 将此远程文件夹映射到 Windows 驱动器,执行命令“net use”以自动挂载驱动器,因此用户不必知道密码。密码在代码内部加密,加密算法复杂且混淆,因此这些用户很难对代码进行反编译和解密密码。我知道这个解决方案不是 100% 安全的,但在这种情况下对我来说已经足够了。

当我使用 C# Process 执行下面的命令时,一切都像魅力一样工作(必须安装 WinFsp 和 SSHFS-Win)。

net use S: \\sshfs\ssh_user@host\shared_folder [decrypted_password] /user:ssh_user

但是在进程执行期间,密码在任务管理器(“详细信息”选项卡>命令行)上可见,我认为这是不可接受的。

为了避免这种情况,我尝试了以下方法:

net use S: \\sshfs\ssh_user@host\shared_folder * /user:ssh_user

现在,该过程等待用户输入密码。在这种情况下,我可以使用 SendKeys.Send 从代码中自动键入密码,但随后可以使用任何键盘记录器轻松提取密码。解决方案应该是重定向标准输入,以便我可以从代码将密码发送到进程,但这根本不起作用。当我使用以下代码时,该命令以“拒绝访问”错误进行响应。

这是行不通的:

Process proc = new() {
    StartInfo = new("net") {
        CreateNoWindow = true,
        UseShellExecute = false,
        RedirectStandardInput = true,
        Arguments = @"use S: \\sshfs\ssh_user@host\shared_folder * /user:ssh_user"
    }
};

proc.Start();
proc.StandardInput.WriteLine(decryptedPassword);
proc.StandardInput.Close();
proc.WaitForExit();

我已经用其他命令而不是“net use”测试了这段代码,它运行良好。例如,如果我使用 sort 命令对其进行测试,该命令也会等待用户的输入,则密码将作为输入传递给命令而不会出现问题:

Process proc = new() {
    StartInfo = new("sort") {
        CreateNoWindow = true,
        UseShellExecute = false,
        RedirectStandardInput = true,
        RedirectStandardOutput = true
    }
};

proc.Start();
proc.StandardInput.WriteLine(decryptedPassword);
proc.StandardInput.Close();
Debug.WriteLine(proc.StandardOutput.ReadToEnd());
proc.WaitForExit();

现在,我可以看到 Visual Studio 调试控制台上打印的密码,因此我知道代码是正确的。

我怀疑“net use”命令(或者可能是 SSHFS-Win)不知何故不允许输入重定向,并且需要在键盘上实际键入密码。为了确认这一点,我直接在Windows命令提示符(cmd.exe)上测试了以下命令,并且总是得到“拒绝访问”:

echo password | net use S: \\sshfs\ssh_user@host\shared_folder * /user:ssh_user

echo(password|net use S: \\sshfs\ssh_user@host\shared_folder * /user:ssh_user

echo|set /p=password|net use S: \\sshfs\ssh_user@host\shared_folder * /user:ssh_user

任何人都可以确认是否无法使用 net use 命令进行输入重定向吗?还是我做错了什么?有人有其他解决方案吗?

C# SSH IO 重定向 SSHFS 网络使用

评论


答:

0赞 nicolasim 10/23/2023 #1

最后,我通过执行 sshfs-win.exe 而不是“net use”解决了这个问题。使用 sshfs-win.exe,标准输入重定向可以正常工作,正如预期的那样。

Process proc = new() {
    StartInfo = new("C:/Program Files/SSHFS-Win/bin/sshfs-win.exe") {
        CreateNoWindow = true,
        UseShellExecute = false,
        RedirectStandardInput = true,
        RedirectStandardOutput = true,
        RedirectStandardError = true,
        Arguments = @"svc \sshfs\ssh_user@host\shared_folder S:"
    }
};

proc.Start();
proc.BeginOutputReadLine();
proc.BeginErrorReadLine();
proc.StandardInput.WriteLine(decryptedPassword);
proc.StandardInput.Close();

此外,当直接在 Windows 命令提示符上执行时,这也很有效:

cd "C:\Program Files\SSHFS-Win\bin"
echo(password|sshfs-win.exe svc \sshfs\ssh_user@host\shared_folder S: