Eu tenho um servidor Ubuntu ao qual estou me conectando usando SSH.
Preciso fazer o upload de arquivos da minha máquina para /var/www/
o servidor em que os arquivos /var/www/
pertencem root
.
Usando o PuTTY, depois que eu faço o login, preciso digitar a sudo su
minha senha primeiro para poder modificar os arquivos /var/www/
.
Mas, quando estou copiando arquivos usando o WinSCP, não consigo criar arquivos de criação / modificação /var/www/
, porque o usuário com o qual estou me conectando não tem permissões nos arquivos /var/www/
e não posso dizer sudo su
como faço no caso de uma sessão ssh .
Você sabe como eu poderia lidar com isso?
Se eu estivesse trabalhando na minha máquina local, telefonaria, gksudo nautilus
mas, neste caso, só tenho acesso ao terminal na máquina.
Respostas:
Você está certo, não há
sudo
quando se trabalhascp
. Uma solução alternativa é usar oscp
upload de arquivos para um diretório em que o usuário tenha permissões para criar arquivos, faça login via ssh e usesudo
para mover / copiar arquivos para o destino final.Outra solução seria alterar as permissões / propriedade dos diretórios nos quais você está carregando os arquivos, para que seu usuário não privilegiado possa gravar nesses diretórios.
Geralmente, trabalhar na
root
conta deve ser uma exceção, não uma regra - a maneira como você formula sua pergunta me faz pensar que talvez você esteja abusando um pouco dela, o que por sua vez leva a problemas com permissões - em circunstâncias normais, você não precisa privilégios de superadministrador para acessar seus próprios arquivos.Tecnicamente, você pode configurar o Ubuntu para permitir o login remoto diretamente como
root
, mas esse recurso está desativado por um motivo, por isso aconselho você a não fazer isso.fonte
scp -R mysite [email protected]:/home/dimitris/
2.ssh [email protected]
3.sudo mv ~/mysite /var/www
- é um processo em duas etapas: primeiro, vocêscp
envia os arquivos para o diretório inicial, depois faz logon via ssh e copia / move os arquivos para onde eles deveriam estar.Outro método é copiar usando tar + ssh em vez de scp:
fonte
sudo: sorry, you must have a tty to run sudo
. Se eu adicionar "-t" para alocar um TTY, receboPseudo-terminal will not be allocated because stdin is not a terminal.
. Não consigo ver isso funcionando sem o sudo sem senha.ssh -t [email protected] "sudo tar -x --no-same-owner -C /var/www"
sudo tar
, arquivá-lo, alterar permissões usandochmod
echown
, em seguida, copiá-lo para local. Especialmente se for um diretório.Atalho
Do servidor para a máquina local:
Da máquina local para o servidor:
fonte
Você também pode usar
ansible
para fazer isso.Copie para o host remoto usando o
copy
módulo da ansible :Busque no host remoto usando o
fetch
módulo da ansible :NOTA:
-i HOST,
sintaxe não é um erro de digitação. É a maneira de usar o ansible sem precisar de um arquivo de inventário.-b
faz com que as ações no servidor sejam executadas como raiz.-b
expande para--become
, e o padrão--become-user
é root, com o padrão--become-method
sendo sudo.flat=yes
copia apenas o arquivo, não copia todo o caminho remoto que leva ao arquivocopy
módulo, mas não pelofetch
módulo.Invocação específica para esta pergunta
Aqui está um exemplo específico e completo, assumindo que o diretório do host local que contém os arquivos a serem distribuídos seja
sourcedir
e que o nome do host do destino remoto sejahostname
:Com a chamada concisa sendo:
PS, percebo que dizer "basta instalar esta ferramenta fabulosa" é uma resposta meio surda. Mas achei que o ansible é super útil para administrar servidores remotos; portanto, a instalação do aplicativo certamente trará outros benefícios além da implantação de arquivos.
fonte
ansible -i "hostname," all -u user --become -m copy -a ...
-i 'host,'
seria uma sintaxe válida? Eu acho que é fácil perder pontuação assim ao ler um comando. (Para o leitor Quer dizer, se não o shell.)-i 'host,'
mesmo que-i host,
ou-i "host,"
. Em geral, prefiro manter essas invocações o mais curtas possível para evitar que sejam assustadoras, mas você deve se sentir à vontade para torná-las tão detalhadas e explícitas quanto achar necessário para maior clareza.Quando você executa
sudo su
, todos os arquivos criados por você pertencem ao root, mas por padrão não é possível efetuar login diretamente como root com ssh ou scp. Também não é possível usar o sudo com o scp, portanto os arquivos não são utilizáveis. Corrija isso reivindicando a propriedade dos seus arquivos:Supondo que seu nome de usuário fosse dimitri, você poderia usar este comando.
A partir de então, como mencionado em outras respostas, a maneira "Ubuntu" é usar o sudo, e não os logins de raiz. É um paradigma útil, com grandes vantagens de segurança.
fonte
sudo chow ...
para cada diretório único: S-R
inchown
diz para alterar a propriedade desse diretório e todos os arquivos e diretórios filhos recursivamente ... para que você possa fazer o que quiser.Pode ser a melhor maneira é usar
rsync
( Cygwin / cwRsync no Windows) sobre SSH?Por exemplo, para enviar arquivos com o proprietário
www-data
:No seu caso, se você precisar de privilégios de root, o comando será assim:
Veja: scp no servidor remoto com sudo .
fonte
Se você usar as ferramentas OpenSSH em vez do PuTTY, poderá fazer isso iniciando a
scp
transferência de arquivos no servidor comsudo
. Verifique se você tem umsshd
daemon em execução na sua máquina local. Comssh -R
você pode dar ao servidor uma maneira de entrar em contato com sua máquina.Na sua máquina:
Além de fazer o login no servidor, isso encaminhará todas as conexões feitas na porta 11111 do servidor para a porta 22 da sua máquina: a porta na qual você
sshd
está ouvindo.No servidor, inicie a transferência de arquivos da seguinte maneira:
fonte
Você pode usar o script que escrevi inspirado neste tópico:
mas isso requer algumas coisas malucas (que são feitas automaticamente por script)
Aqui está o script:
fonte
Você pode combinar ssh, sudo e, por exemplo, tar para transferir arquivos entre servidores sem poder fazer login como root e sem ter permissão para acessar os arquivos com seu usuário. Isso é um pouco complicado, então escrevi um script para ajudar nisso. Você pode encontrar o script aqui: https://github.com/sigmunau/sudoscp
ou aqui:
fonte
Aqui está uma versão modificada da resposta de Willie Wheeler que transfere o (s) arquivo (s) via tar, mas também suporta a passagem de uma senha para o sudo no host remoto.
O pouco de mágica extra aqui é a opção -S para sudo. Na página do manual do sudo:
Agora, na verdade, queremos que a saída do tar seja canalizada para o ssh e isso redirecione o stdin do ssh para o stdout do tar, removendo qualquer maneira de passar a senha para o sudo a partir do terminal interativo. (Poderíamos usar o recurso ASKPASS do sudo na extremidade remota, mas isso é outra história.) Podemos obter a senha no sudo, capturando-a com antecedência e acrescentando-a à saída do tar, executando essas operações em um subshell e canalizando a saída de o subshell em ssh. Isso também tem a vantagem adicional de não deixar uma variável de ambiente contendo nossa senha pendurada em nosso shell interativo.
Você notará que não executei 'read' com a opção -p para imprimir um prompt. Isso ocorre porque o prompt de senha do sudo é convenientemente passado de volta ao stderr do nosso shell interativo via ssh. Você pode se perguntar "como o sudo está sendo executado, uma vez que está sendo executado dentro do ssh à direita do nosso pipe?" Quando executamos vários comandos e canalizamos a saída de um para o outro, o shell pai (o shell interativo neste caso) executa cada comando na sequência imediatamente após a execução do anterior. À medida que cada comando atrás de um pipe é executado, o shell pai anexa (redireciona) o stdout do lado esquerdo ao stdin do lado direito. A saída se torna entrada à medida que passa pelos processos.
Nosso shell interativo é o PID 7168, nosso subshell é o PID 7969 e nosso processo ssh é o PID 7970.
A única desvantagem é que a leitura aceitará a entrada antes que o sudo tenha tempo de enviar sua solicitação de volta. Em uma conexão rápida e em um host remoto rápido, você não notará isso, mas poderá se estiver lento. Qualquer atraso não afetará a capacidade de inserir o prompt; isso pode aparecer após você começar a digitar.
Nota: eu simplesmente adicionei uma entrada de arquivo host para "remote_Host" na minha máquina local para a demonstração.
fonte