Копирование файлов на удаленном сервере unix с использованием Renci SSH.NET

Я пытаюсь скопировать файлы из одной папки в другую на удаленном сервере unix. Я использую веб-приложение на С# и использую Renci SSH.Net для этого процесса. Когда я использую команду Cp, в строке чтения добавляется дополнительное пространство, и я получаю сообщение об ошибке

cp: невозможно указать `folder1/folder_two/fol_three/changecolumn.txt': нет такого файла или каталога

Я использовал следующий код:

SshClient sshclient = new SshClient("hostname", "username", "pwd");
sshclient.Connect();
ShellStream stream = sshclient.CreateShellStream("cmsd", 80, 24, 800, 600, 1024);
sendCommand("sudo su - wwabc1", stream).ToString();
sendCommand("whoami", stream).ToString();
sendCommand("cp / folder1/folder_two/fol_three/" + uploadedfileName + uploadedfileExt + " /Target1/folder1/folder_two/target/", stream).ToString();

public StringBuilder sendCommand(string customCMD, ShellStream stream)
        {
            StringBuilder answer;
            var reader = new StreamReader(stream);
            var writer = new StreamWriter(stream);
            writer.AutoFlush = true;
            WriteStream(customCMD, writer, stream);
            answer = ReadStream(reader);
            return answer;
        }

        private void WriteStream(string cmd, StreamWriter writer, ShellStream stream)
        {
            writer.WriteLine(cmd);
            while (stream.Length == 0)
            {
                Thread.Sleep(500);
            }
        }

        private StringBuilder ReadStream(StreamReader reader)
        {
            StringBuilder result = new StringBuilder();

            string line;
            while ((line = reader.ReadLine()) != null)
            {
                result.AppendLine(line);
            }
            return result;
        }

Результат имеет данные, как показано ниже:

cp / folder1/folder_two/fol_three/changecolumn
< cp / folder1/folder_two/fol_three/changecolumnn                         ame.txt  /wwabc1/Target1

</test_files/changecolumnname.txt  /wwabc1/Target1/                         folder1/folder_two/target/
cp: omitting directory `/'
cp: cannot stat `folder1/folder_two/fol_three//changecolumnname.txt': No such file or directory
[wwabc1@host ~]$ 
[wwabc1@host ~]$ 

Между ними добавлено слишком много пробелов, но я передаю информацию без пробелов между ними. Как это исправить? Спасибо


person venkat14    schedule 15.01.2019    source источник
comment
Я предполагаю, что проблема связана с uploadedfileName и uploadedfileExt, для которых вы не предоставили источник   -  person Neil    schedule 15.01.2019
comment
uploadedfileName и uploadedfileExt содержат данные как - changecolumnname.txt   -  person venkat14    schedule 15.01.2019
comment
Да, но так ли это? Ваше сообщение об ошибке предполагает, что это не так. Попробуйте сделать var s = $"cp / folder1/folder_two/fol_three/{uploadedfileName}{uploadedfileExt} /Target1/folder1/folder_two/target/" и посмотрите, что у вас получится.   -  person Neil    schedule 15.01.2019
comment
Кстати, если вы хотите скопировать один поток в другой, вы можете сделать stream1.CopyTo(stream2)   -  person Neil    schedule 15.01.2019
comment
я должен добавить имя хоста в начале начальной папки1?   -  person venkat14    schedule 15.01.2019
comment
Все ваши ошибки связаны с этим дополнительным пробелом после первой косой черты. Если у вас другая проблема, возможно, это должен быть другой вопрос.   -  person Neil    schedule 15.01.2019
comment
Если вы считаете, что проблема не в переменных uploadedfileName и uploadedfileExt, покажите нам минимально воспроизводимый пример - с буквальным примером cp, без каких-либо переменных.   -  person Martin Prikryl    schedule 15.01.2019


Ответы (1)


Здесь:

sendCommand("cp / folder1...

Обратите внимание на пробел после первого /.

person Neil    schedule 15.01.2019
comment
я помечаю вопрос как опечатку - person Cleptus; 15.01.2019
comment
Это пространство я удалил. В выводе, который я разместил, вы можете увидеть пробел как ‹ cp / folder1/folder_two/fol_three/changecolumnn ame.txt /wwabc1/Target1 После changecolumnn и ame есть пробел, который я не пропустил. - person venkat14; 15.01.2019
comment
Это не проблема опечатки - person venkat14; 15.01.2019
comment
Все пробелы возникают из-за того, что вы используете оболочку вместо каналов exec - то, что я не рекомендовал вам использовать в моем предыдущем ответе на ваш другой вопрос stackoverflow .com/q/54194139/850848 - И это на самом деле, скорее всего, не связано с вашей непосредственной проблемой - вы можете видеть это в фактическом сообщении об ошибке, где имя файла не содержит пробелов: cp: cannot stat 'folder1/folder_two/fol_three//changecolumnname.txt': No such file or directory. - person Martin Prikryl; 15.01.2019
comment
Похоже, имя вашего файла недействительно, поэтому ваша следующая проблема (после исправления проблемы, предложенной @Neil) по-прежнему, скорее всего, является (еще одной) опечаткой. - person Martin Prikryl; 15.01.2019