How to write content to file on linux SFTP server using SshClient?

只愿长相守 提交于 2019-12-08 13:54:34

问题


I am dealing with Linux SFTP server using .Net (SshClient) code, so I am creating folder on SFTP server and creating files also. For this I am using following code,

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();
}

This code is working file to create a folder and text files on SFTP but Now I am trying to write data to that file, and for that I am using following code,

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

But it is not working. I am getting error says Error = "bash: /sftpusers/asb/schema/filename.txt: Permission denied\n.

I am little confused that, if same command i.e. echo pwd | sudo -s cmd is creating folder, files on SFTP server then why it failing while writing content to file.

Need help on this as early as possible.


回答1:


sudo touch ./blabla

Will create a blabla file as root with root(!) permissions. The owner of this file will be root and most probably the write will be only allowed for root.

sudo echo 123 > ./blabla

This will execute echo as root, and redirect the output to blabla as the shell(!) user. sudo makes the command echo run as root. But the redirection > is done by the shell, not by sudo. So the redirection is done by the however opened the shell, in your case by a user that isn't root, who can't access the file.

You have to write to the file as root for it to work. You can run a subshell as root:

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

This will echo 123 and execute sh as root with the command cat redirected to the first argument of the script, that is blabla. Note that as the shell is run as root, the redirection is also done as root, so the shell is able to open and write to the file.

Alternatively a more clean approach is to make a tee.

echo 123 | sudo tee blabla >/dev/null

Remember to redirect tee's stdout to null, so it doesn't print anything.

Do:

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

Note that because you use sudo -S to read the password (which is unsafe and kind of bad), you can't use stdin to pass written string to tee.



来源:https://stackoverflow.com/questions/55529974/how-to-write-content-to-file-on-linux-sftp-server-using-sshclient

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!