linux - 如何使用SshClient将内容写入Linux SFTP服务器上的文件?

标签 linux ssh.net

我正在使用.Net(SshClient)代码处理Linux SFTP服务器,所以我在SFTP服务器上创建文件夹并创建文件。为此,我使用以下代码,

using (var client = new SshClient(WebConfigurationManager.AppSettings["SftpServer"], WebConfigurationManager.AppSettings["SftpUserName"], WebConfigurationManager.AppSettings["SftpPassword"]))
{
   client.Connect();

    if (client.IsConnected)
    {
        //  Check if the Folder Already Exists 
        var ifExists = client.RunCommand("cat /etc/passwd  | grep -w " + ftpUserName);
        // If the Folder and User Does Not exists , create both 
        if (string.IsNullOrEmpty(ifExists.Result))
        {
            client.RunCommand("echo Asdf@123 | sudo -S mkdir /sftpusers/" + ftpUserName);
            client.RunCommand("echo Asdf@123 | sudo -S mkdir /sftpusers/" + ftpUserName + "/import"); //  this is for creating folder
            client.RunCommand("echo Asdf@123 | sudo -S mkdir /sftpusers/" + ftpUserName + "/schema");
            client.RunCommand("echo Asdf@123 | sudo -S touch /sftpusers/" + ftpUserName + "/schema/fileName.txt");
            sftpCreated = true;
        }
    }
    client.Disconnect();
}

此代码是在 SFTP 上创建文件夹和文本文件的工作文件,但现在我正在尝试将数据写入该文件,为此我正在使用以下代码,

client.RunCommand("echo Asdf@123 | sudo -S echo hi user >> /sftpusers/asb/schema/filename.txt");

但是它不起作用。我收到错误消息 Error = "bash:/sftpusers/asb/schema/filename.txt: Permission returned\n.

我有点困惑,如果相同的命令,即 echo pwd | sudo -s cmd 正在 SFTP 服务器上创建文件夹、文件,那么为什么在将内容写入文件时失败。

尽早需要这方面的帮助。

最佳答案

sudo touch ./blabla

将以 root 身份创建一个 blabla 文件,并具有 root(!) 权限。该文件的所有者将是 root,并且很可能只允许 root 进行写入。

sudo echo 123 > ./blabla

这将以 root 身份执行 echo,并将输出重定向到 blabla 作为 shell(!) 用户。 sudo 使命令 echo 以 root 身份运行。但重定向 > 是由 shell 完成的,而不是由 sudo 完成的。因此,重定向是由打开的 shell 完成的,在您的情况下,由非 root 用户完成,该用户无法访问该文件。

您必须以 root 身份写入该文件才能使其工作。您可以以 root 身份运行子 shell:

echo 123 | sudo sh -c 'cat > ./blabla'
// or better for scripting, cause no double quoting is needed
echo 123 | sudo sh -c 'cat > "$1"' -- ./blabla

这将echo 123并以root身份执行sh,命令cat重定向到脚本的第一个参数,即blabla。请注意,由于 shell 以 root 身份运行,因此重定向也以 root 身份完成,因此 shell 能够打开并写入文件。

另一种更简洁的方法是制作T 恤

echo 123 | sudo tee blabla >/dev/null

记住将 tee 的 stdout 重定向为 null,这样它就不会打印任何内容。

做:

 client.RunCommand("echo Asdf@123 | sudo -S sh -c 'echo hi user >> "$1"' -- /sftpusers/asb/schema/filename.txt");

请注意,由于您使用 sudo -S 读取密码(这是不安全且有点不好的),因此您无法使用 stdin 将写入的字符串传递给 tee

关于linux - 如何使用SshClient将内容写入Linux SFTP服务器上的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55529974/

相关文章:

linux - 如何将文件的第一个值传递给变量?

c# - 为使用 SSH.NET SshClient.CreateShellStream 执行的命令 (sudo/su) 提供子命令

c# - SSH.Net隧道

c# - 在 docker 机器上调试时 MySql 连接被拒绝

c++ - 如何正确丢弃能力?

linux - Powershell 从 Linux 客户端连接到 Windows 远程

linux - X11 和 ARGB 视觉效果 : does DefaultDepth() never return 32?

我可以多次运行同一个线程吗?

c# - 使用 SSH.NET 库使用 .ppk 私钥进行身份验证

c# - 使用 SSH.Net 下载和返回非阻塞数据流