gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:39:32 25 4
gpt4 key购买 nike

我正在使用.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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com