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

时间:2019-04-05 07:07:19

标签: 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 denied\n说错了。

如果使用相同的命令,即echo pwd | sudo -s cmd,我对此几乎不会感到困惑。 在SFTP服务器上创建文件夹,文件,然后为什么在将内容写入文件时失败。

对此需要尽快的帮助。

1 个答案:

答案 0 :(得分:3)

sudo touch ./blabla

将创建一个blabla文件作为具有root(!)权限的root用户。该文件的所有者将是root,最有可能只允许root用户写入。

sudo echo 123 > ./blabla

这将以root用户身份执行echo,并以shell(!)用户的身份将输出重定向到blablasudo使命令echo以root身份运行。但是重定向>是由Shell而不是sudo完成的。因此,重定向是通过打开外壳程序来完成的,对于您而言,不是由非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能够打开并写入文件。

或者,更干净的方法是制作一个tee

echo 123 | sudo tee blabla >/dev/null

请记住将tee的标准输出重定向为null,因此它不会打印任何内容。

要做:

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

请注意,因为您使用sudo -S来读取密码(这是不安全的,并且很糟糕),所以不能使用stdin将写入的字符串传递给tee