sudo touch ./blabla
Создает файл blabla
как root с правами root (!).Владельцем этого файла будет пользователь root, и, скорее всего, запись будет разрешена только для пользователя root.
sudo echo 123 > ./blabla
Это выполнит echo
в качестве пользователя root и перенаправит вывод в blabla
в качестве оболочки (!) пользователь.sudo
заставляет команду echo
запускаться от имени пользователя root.Но перенаправление >
выполняется оболочкой, а не sudo
.Таким образом, перенаправление выполняется открытой оболочкой, в вашем случае пользователем, не являющимся пользователем root, который не может получить доступ к файлу.
Вы должны записать файл в качестве пользователя root, чтобы онРабота.Вы можете запустить subshell от имени пользователя 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
Это echo 123
и выполнение sh
от имени пользователя root с помощью команды cat
, перенаправленной на первый аргумент сценария, то есть blabla
.Обратите внимание, что поскольку оболочка запускается от имени пользователя root, перенаправление также выполняется от имени пользователя root, поэтому оболочка может открывать и записывать в файл.
В качестве альтернативы, более чистый подход - сделать tee
.
echo 123 | sudo tee blabla >/dev/null
Не забудьте перенаправить стандартный вывод tee
на ноль, чтобы он ничего не печатал.
Do:
client.RunCommand("echo Asdf@123 | sudo -S sh -c 'echo hi user >> "$1"' -- /sftpusers/asb/schema/filename.txt");
Обратите внимание, потому что выиспользуйте sudo -S
для чтения пароля (что небезопасно и плохо), вы не можете использовать stdin для передачи записанной строки в tee
.