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