У меня есть этот код, который запускает импорт CSV через командную строку для Windows и Linux:
var isLinux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux);
ProcessStartInfo startInfo = null;
if (isLinux)
{
startInfo = new ProcessStartInfo
{
FileName = @"/bin/bash",
Arguments = $"-c 'cat \"{filePath}\" | psql -h 127.0.0.1 -U {user} -d {dbname} -w -c \"copy data_temp from stdin csv header\"' ",
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true,
};
}
else
{
startInfo = new ProcessStartInfo
{
FileName = @"cmd.exe",
Arguments = $"/c cat \"{filePath}\" | psql -h 127.0.0.1 -U {user} -d {dbname} -w -c \"copy data_temp from stdin csv header\" ",
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true,
};
}
using (var process = new Process { StartInfo = startInfo})
{
process.Start();
string result = process.StandardOutput.ReadToEnd();
process.WaitForExit();
}
Он отлично работает в Windows, но в Linux (Ubuntu 18.04) result
всегда пуст и импорт не работает.
Я попытался самостоятельно написать запрос в терминале:
/bin/bash -c 'cat "/path/file.csv" | psql -h 127.0.0.1 -U user -d user -w -c "copy data_temp from stdin csv header"'
И он работает нормально, но при запуске из моего кода он просто возвращает пустую строку и не импортирует.
Что я здесь не так делаю?
Редактировать: Мне приходит в голову, что это может быть проблема с разрешением. Этот код находится внутри моего основного веб-приложения asp.net, поэтому я думаю, что он будет работать от имени пользователя www-data
. www-data
установлен на nologin, так что это может вызвать проблемы. Не уверен в решении