Como usar o PSCP para copiar arquivos da máquina Unix para a máquina Windows em que o caminho de destino possui espaços?

14

Estou tendo um problema ao usar o PSCP em um programa C # para copiar um arquivo de uma máquina Unix para uma máquina Windows. O problema ocorre apenas quando a pasta de destino na máquina Windows possui um espaço nela. Por exemplo, o seguinte funciona bem: (NOTA: o endereço IP e a senha foram alterados para este exemplo)

pscp.exe -pw MyPassword [email protected]:/etc/myfolder/myfile.opt C:\download

Mas quando eu mudo para isso:

pscp.exe -pw MyPassword [email protected]:/etc/myfolder/myfile.opt C:\download files

Eu recebo o seguinte erro: Mais de uma fonte remota não é suportada.

Percebo que é porque o PSCP interpreta o espaço como outro alvo. Mas como posso fazer isso? Eu tentei todos os tipos de coisas como colocá-lo entre aspas e escapar do espaço. Eu tentei todas as seguintes opções e nada funciona:

pscp.exe -pw MyPassword [email protected]:/etc/myfolder/myfile.opt "C:\download files"
pscp.exe -pw MyPassword [email protected]:/etc/myfolder/myfile.opt C:\"download files"
pscp.exe -pw MyPassword [email protected]:/etc/myfolder/myfile.opt C:\download\\ files

Alguma ideia?

Corey Burnett
fonte

Respostas:

18

Embora a resposta apropriada seja provavelmente usar o WinSCP e sua biblioteca C #, eu encontrei uma maneira de fazer o PSCP funcionar quando a pasta de destino tem um espaço nela.

A resposta correta é fazer isso:

pscp.exe -pw MyPassword [email protected]:/etc/myfolder/myfile.opt "C:\download files"

Acontece que eu estava tendo outro problema que estava me fazendo pensar que o exposto acima não estava funcionando. Originalmente, eu estava usando o caminho completo para o executável PSCP.EXE. O caminho completo incluía espaços. Então, eu estava tentando fazer o seguinte:

"C:\My PSCP Folder\pscp.exe" -pw MyPassword [email protected]:/etc/myfolder/myfile.opt "C:\download files"

E eu estava tentando chamar isso de c # usando Process.Start () e estava falhando. Parecia que poderia lidar com isso se houvesse um espaço no caminho PSCP ou no caminho de destino, mas não ambos. Corrigi isso incluindo o caminho para o PSCP executável nas minhas variáveis ​​de ambiente do Windows. Agora posso chamar o PSCP.EXE e ele funciona com as aspas da pasta de destino.

Corey Burnett
fonte
10

Não use pscp.

O cliente WinSCP (construído sobre o PuTTY) fornece um assembly .NET . Aqui está um exemplo .

user1686
fonte
Bem, eu olhei para isso e me deparei com um problema diferente. Aparentemente, o WinSCP requer a chave do host SSH (que eu não tenho). Quando eu estava usando o PSCP, havia uma maneira de automatizar a aceitação da chave do host. Mas, pelo que sei ao ler a documentação do WinSCP C #, parece não haver maneira de aceitar automaticamente a Chave do Host. Alguma ideia?
Corey Burnett
1
@CoreyBurnett: Você está se conectando sempre ao mesmo servidor?
precisa saber é o seguinte
Estou construindo um aplicativo que será instalado em uma máquina Windows e potencialmente se conectará a vários servidores Linux diferentes. Quando eu estava usando o PSCP, encontrei uma maneira de dizer à linha de comando para aceitar automaticamente a chave do host. Dessa forma, eu não precisava saber o que a Chave do Host estava adiantando. No entanto, parece que não consigo encontrar essa opção usando C # e WinSCP.
precisa saber é o seguinte
Pessoalmente, consideraria um grave problema de segurança se um cliente SSH estivesse aceitando chaves do host sem verificação ou confirmação do usuário.
usar o seguinte comando
Concordo. No entanto, essa é uma situação muito específica em que estamos construindo um aplicativo que será instalado em um laptop e, em seguida, esse laptop será conectado a uma caixa Unix em um ambiente controlado. Essa configuração será vendida aos clientes. Nem está conectado à Internet. Estou apenas tentando simplificar a instalação e o uso para que o operador do aplicativo não precise saber ou se preocupar com as coisas da Chave do Host. Deveria funcionar.
Corey Burnett
1

Anexar um período à pasta de destino. O seguinte deve funcionar com o anexo . no seu exemplo:

"C:\My PSCP Folder\pscp.exe" -pw MyPassword [email protected]:/etc/myfolder/myfile.opt "C:\download files\."
Matt
fonte
0
pscp.exe -pw MyPassword [email protected]:/etc/myfolder/myfile.opt "C:\download files"

bem, primeiro, como você já mencionou, você tem espaços em seu caminho. Portanto, seria aconselhável usar aspas "C: \ baixar arquivos". Segundo, como você já apontou, você precisa adicionar seu aplicativo ao PATH para chamar o pscp sem nenhum caminho estranho. e terceiro. Use convenções de nomenclatura que evitem essa confusão causada por citar tudo.

camelCaseNaming
underscore_naming

Ambos resolvem o problema e você parece 100500 vezes mais frio.

Anton Stafeyev
fonte