Como rodar múltiplos comandos usando o sudo, no Linux e UNIX

Você pode usar uma técnica muito simples, para rodar múltiplos comandos — que precisem de privilégios administrativos.
Se você já sabe como rodar um comando atrás do outro, em fila, como no exemplo abaixo, talvez saiba que, ao fazer isto com o sudo, frequentemente a senha dada “perde a validade”, deixando a sequencia de comandos em espera.
teclado dell
Para rodar uma sequencia de comandos, use o ‘&&’, desta forma:

comando1 &&; comando2 && comando3

Se quiser que eles tenham privilégios de root, em tese, bastaria isso:

sudo comando1 && sudo comando2 && sudo comando3

Depois disto, você vai embora pra casa, tomar um café ou fazer qualquer outra coisa, confiante de que as 3 tarefas serão realizadas, sem interrupção — uma logo após a outra.
O problema, nesta linha de raciocínio, surge quando a gente se lembra que o tempo padrão de “validade” do comando sudo é 15 minutos.
Decorrido este prazo, o sudo volta a pedir a senha do usuário.
Desta forma, transcorridos os 15 minutos, a sua linha de comandos poderá ainda estar parada e sem conclusão — esperando pela senha.
Para evitar esta chatice, rode a sequência com o sudo, usando o interpretador de comandos sh com a opção ‘-c’:

sudo sh -c 'comando1 && comando2'

Com esta formação, você também pode usar o bash, se quiser:

sudo bash -c 'comando1 && comando2'

Pode ser útil usar esta técnica quando se quer deixar o sistema sendo atualizado — tarefa na qual, comumente, se usa 2 comandos (no Debian/Ubuntu):


sudo sh -c 'apt update && apt -y full-upgrade'

O que este comando faz:

  • sudo — como você já sabe, confere superpoderes a tudo o que vem depois, nesta mesma linha de comando.
  • sh — abre uma shell do interpretador de comandos Dash padrão do Linux/Unix.
  • -c — executa os comandos, que seguem entre as aspas.

Ainda, com o comando apt, o exemplo abaixo roda a opção de atualização com os repositórios, antes de instalar um programa:


sudo -- sh -c 'apt update && apt install -y thermald'

Conteúdo relacionado pelo Google

Como realizar backup incremental no Linux, usando o comando tar

O comando tar está ligado às tarefas de gestão de backups desde sua origem.
O nome do utilitário se refere ao dispositivo de gravação/leitura em fitas (tape drives), muito usado, ainda hoje, por sua confiabilidade e capacidade de armazenamento.
backup tape drive
Tar é abreviatura para tape archiver.

Apesar do nome, nunca foi restrito a qualquer tipo de mídia de gravação.
Backups feitos com o tar podem ser armazenados aonde você achar melhor.

Neste post, vamos abordar alguns usos do programa para, no final, montar um pequeno script, que você pode alterar para criar seu próprio backup automatizado ou integrar a outro script mais complexo.
Se tiver alguma dúvida, por favor, clique nos links presentes no texto para obter mais informações.
Não esqueça de dar uma olhada também na tag backup deste site e nos links da sessão de referências.

Os desafios de fazer backups eficientes

Fazer cópias de segurança de um grande volume de dados, pode tomar muito tempo.
Consome tanto tempo, que muita gente deixa de ter este cuidado — e pode se arrepender amargamente por isso.
O ideal é automatizar o processo de backup.
O processo de cópia e compressão de uma grande quantidade de arquivos também consome tempo de processamento — todo o sistema pode ficar significativamente mais lento durante a realização da tarefa.

Para não ser uma “coisa chata” na sua vida, contudo, o backup eficiente precisa ser automático e rodar em background, ou seja, ser executado nos bastidores — de preferência, em um horário em que você não esteja usando (muito) o computador.

fita cartuchos dell ultrium
O backup incremental é demorado na primeira vez em que é executado, mas é rápido nas outras execuções.
Isto ocorre por que consiste em apenas adicionar arquivos novos ou que foram alterados, desde a última vez em que foi feito. O resto é ignorado.

Como fazer o backup incremental com o comando tar

Se você tiver algum dúvida extra, leia o post “9 exemplos de uso do comando tar“.
Para realizar um backup simples de um diretório no sistema rode o tar, seguido do nome desejado para o arquivo de backup e do nome do diretório a ser copiado:

tar cvf justincase-backup-2afeira.tar /home/justincase

No comando acima:

  • a opção ‘c’ indica que você deseja comprimir/copiar os arquivos do diretório para dentro de um só arquivo de backup.
  • a opção ‘v’ indica que você deseja ter feedback sobre a execução da tarefa. Você pode usar ‘vv’ ou ‘vvv’ e tornar o comando ainda mais verboso.
  • a opção ‘f’ deve preceder o nome do arquivo que vai abrigar o backup.

Há outras formas de usar este mesmo comando. As opções, por exemplo, podem ser dadas separadamente:

tar -c -v -f justincase-backup-2afeira.tar /home/justincase

Para listar os arquivos incrementais, durante o processo, inclua a opção ‘-g’ à linha de comando.
É uma boa prática acrescentar a opção de compressão ao seu comando de backup com o tar:

  • você pode usar a opção ‘a’ para determinar automaticamente qual o programa/sistema de compressão será usado sobre o arquivo — baseado na sua extensão. Portanto se o arquivo tiver a extensão .tar.bz, o tar irá entender que deve usar o bzip para comprimí-lo.
  • você pode indicar manualmente o nome do programa de compressão com a opção ‘I’.
  • as opções de compressão mais comuns são ‘j’ (bzip2), ‘z’ (gzip), ‘Z’ (compress) e ‘J’ (xz). A primeira tem uma taxa de compressão melhor.
  • outras opções possíveis, são ‘–lzip’, ‘–lzop’ e ‘–lzma’.

Lembre-se que arquivos MP3, MPEG, JPEG – entre outros tipos de arquivos de mídia – já estão compactados e, com eles, não é possível obter uma taxa de compressão significativa.

Arquivos comprimidos são transferidos mais rápido pela rede ou para dentro da mídia de backup.
Por outro lado, o processo de compressão/descompressão pode sobrecarregar temporariamente o sistema.

ibm flash backup drive
Para ver o conteúdo do arquivo, use a opção ‘t’:

tar tvf meubackup.tar.bz

Para recuperar o backup use a opção ‘x’ (extract). Neste caso, é importante informar ao tar sobre o método/programa usado para realizar a compressão:

tar xvjf meubackup.tar.bz

No exemplo acima, sei que preciso usar a opção ‘j’, por que a extensão do arquivo indica que ele foi comprimido com o bzip.
Ler a extensão de um arquivo, não é um meio muito confiável para determinar os padrões de compressão utilizados — por que a pessoa que realizou o backup é livre para escolher a extensão que ela quiser.
Você pode usar a opção ‘a’ ou nada, para permitir que o próprio tar descubra o método de compressão utilizado:

tar xvaf meubackup.tar.bz

ou

tar xvf meubackup.tar.bz

Como testar e obter informações de arquivos comprimidos com o tar

Você pode usar o comando file para tentar determinar o método de compressão utilizado em um arquivo:

file --brief ../backup-scripts.tar.bz 

bzip2 compressed data, block size = 900k

Ou, ainda,

file --uncompress --brief --mime backup-scripts.tar.bz 

application/x-tar; charset=binary compressed-encoding=application/x-bzip2; charset=binary

Pode também testar o arquivo com as opções já dadas:

tar -tvf meubackup.tbz

A extensão tbz, usada no exemplo acima, também é muito comum em arquivos tareados, comprimidos com o bzip2.
Testar os seus backups é tão importante quanto fazê-los.
Seria muito ruim descobrir que o backup não funcionou ou teve problemas, justo na hora em que você vai precisar dele.
hdd storage backup

A melhor hora para testar seus backups é quando você não precisa deles.
Assim, é possível analisar a situação com calma e determinar exatamente o que é que não está funcionando neste processo — e corrigir os problemas.

Como criar um script de backup

O script, que segue, reúne basicamente o que foi visto até aqui, neste artigo.
Entendo que você possa necessitar de algo mais complexo, para atender às suas necessidades particulares ou profissionais. Neste caso, ele pode servir como um ponto de partida para chegar aonde quer.
Não esqueça de alterar as variáveis de ambiente e os nomes de diretórios e arquivos, para refletir a sua realidade.

Script de backup


#!/bin/bash
# Descrição = Realiza cópia de segurança de arquivos importantes
# Criado em 20 de Abril de 2017
# Autor: Elias Praciano
# Version 1.0
# 
## cria as variáveis para compor o nome arquivo de backup
# atribui à variável DATA os valores de
# data e hora atuais, para usar
# na composição do nome do arquivo
DATA=$(date +'%d-%m-%Y')
#  Define o nome do arquivo de backup
ARQUIVO=backup-$DATA.tar.gz
# cria a variável contendo o local de origem dos arquivos
ORGDIR=scripts
# cria a variável contendo o local de destino
DESDIR=backup
# comando de criação do backup
tar -cvvjf $DESDIR/$ARQUIVO $ORGDIR

Leia sobre como adicionar uma data ao nome do seu arquivo, se quiser ter mais flexibilidade nesta escolha, dentro do script
Antes de poder ser executado, o script precisa obter permissão de execução. Veja como fazer isto:

chmod +x ./nome-do-script-de-backup.sh

Agora, que ele já está pronto para rodar, teste-o:

./nome-do-script-de-backup.sh

Leia também por que usamos ./ na frente de alguns arquivos executáveis no Linux.

Referências

http://broexperts.com/how-to-perform-incremental-backup-in-linux-using-tar-utility/.

Conteúdo relacionado pelo Google

Como adicionar a data atual ao nome de um arquivo no Bash.

Esta dica pode ajudar em diversas situações, principalmente quando se quer criar um arquivo de dentro de um script Bash e se deseja incluir uma string com a data atual no próprio nome do arquivo.
Um dos casos em que se pode aplicar o recurso é um script de backup de segurança.
Veja alguns exemplos de como chegar ao resultado, no decorrer deste texto.
Se você tiver alguma solução diferente, sinta-se à vontade para compartilhá-la nos comentários.
Para obter a data atual, no formato dia-mês-ano, use a seguinte fórmula:


hoje=$(date +"%d-%m-%y")


O código Bash, acima, irá armazenar dentro da variável hoje a data no formato determinado anteriormente. Para poder ver conteúdo da variável, use o comando echo:


echo "a data atual é: $hoje."

Veja o meu resultado:

a data atual é: 23-04-17.

Para inserir o valor da data atual em uma variável com o nome de um arquivo, basta alterar estes exemplos.
Segue algumas dicas:


hoje=$(date +'%d-%m-%y')
nomearquivo=nomearquivo-$hoje

Para obter o valor da variável nomearquivo, use novamente o comando echo:


echo $nomearquivo
nomearquivo-23-04-17

Quando você for definir o nome do arquivo, dentro do script, basta lhe atribuir o valor da variável nomearquivo.
O post Como realizar backup incremental no Linux tem um exemplo real. Sugiro dar uma olhada.
Se preferir que o ano seja exibido com 4 dígitos, use o %Y (em maiúscula):


hoje=$(date +'%d-%m-%Y'); echo "Data atual: $hoje."

Exemplos de formatação do date no Bash Shell

Acompanhe mais alguns exemplos de formatação do comando.
Para incluir o nome do dia da semana:


hoje=$(date +'%A-%d-%m-%Y'); nomearquivo=backup-$hoje.bak; echo "Nome do meu arquivo de backup, hoje: $nomearquivo."
Nome do meu arquivo de backup, hoje: backup-domingo-23-04-2017.bak.

Ou, ainda, com o nome do mês completo:


hoje=$(date +'%A-%d-%B-%Y'); nomearquivo=backup-$hoje.bak; echo "Nome do meu arquivo de backup, hoje: $nomearquivo."
Nome do meu arquivo de backup, hoje: backup-domingo-23-abril-2017.bak.

E se eu precisar criar vários arquivos de backup, no mesmo dia?! Como posso adicionar a data (que vai ser a mesma), sem sobrescrever arquivos?
Há várias soluções para este caso.
A minha preferida é usar ‘%s’ no lugar de ou em adição ao nome do arquivo.
Este parâmetro retorna o número de segundos decorridos desde 1970-01-01 00:00:00 UTC.
Veja um exemplo:


minhadata=$(date +'%s')
nomearq=arq-$minhadata
echo -e "Nome do arquivo: $nomearq."

Para mim, o resultado da sequencia de comandos acima, foi:

Nome do arquivo: arq-1493045947.

Desta forma, basta que os arquivos sejam criados com uma diferença de, pelo menos, 1 segundo em relação ao outro.
Se esta não for uma necessidade, prefiro usar apenas o parâmetro ‘%F’:



minhadata=$(date +'%F');nomearq=arq-$minhadata;echo -e "\nNome do meu arquivo:\t$nomearq."
Nome do meu arquivo:	arq-2017-04-24.

Ou o ano (em 4 dígitos) seguido do número do dia, uma vez que a data já é exibida à direita dos nomes dos arquivos, na listagem dos diretórios — o que torna esta informação redundante.
Veja um exemplo:


minhadata=$(date +'%Y-%j');nomearq=arq-$minhadata;echo -e "\nNome do meu arquivo:\t$nomearq."
Nome do meu arquivo:	arq-2017-114.

Saiba mais usando o ‘man date’.

Conteúdo relacionado pelo Google

10 dicas para personalizar o prompt do seu terminal

Quem usa o terminal com frequência pode ver grande utilidade na exibição de determinadas informações na linha de comando, na parte que vem antes do cursor.
A personalização pode ser uma brincadeira muito divertida para usuários comuns — mas os administradores, que precisam acessar servidores diferentes podem se beneficiar com command line prompts diferenciados (o que ajuda a saber exatamente em que servidor e diretório você está executando algum comando).
Na série de artigos Como personalizar o prompt da linha de comando no UNIX/Linux, abordei várias formas de configurar:

  • parte 1  — ajustes básicos do prompt
  • parte 2  — como adicionar informações do sistema ao prompt e tornar as mudanças definitivas
  • parte 3  — como colorir o prompt de comando
  • parte 4  — como passar informações do prompt para a barra de títulos do seu terminal

Se você tiver dúvidas, sugiro a leitura dos textos acima. Assim evitamos redundâncias neste artigo e que ele fique mais longo do que o necessário. 😉

Em outras palavras, este post assume que você já detém o conhecimento do que foi discutido naqueles artigos, de forma que possamos ser bem mais objetivos aqui.

Se você acompanhar as tags emulador de terminal e bash vai encontrar outros textos interessantes relacionados a este assunto também.

Exemplos de prompt que você pode experimentar agora

Os exemplos, que seguem, podem ser experimentados de imediato. Basta copiar e colar no seu terminal Linux, Unix ou mesmo no Bash do Windows (eu não testei isso).
Sinta-se encorajada(o) a modificá-los para atender melhor às suas necessidades. Se quiser compartilhar alguma dica de uso, fique á vontade para postar nos comentários.
Como primeiro exemplo, veja este prompt que exibe um smiley sorrindo para comandos normais e um triste para quando você digitar um comando errado:

PS1="\t \w \`if [ \$? = 0 ]; then echo \:\); else echo \:\(; fi\` " 

experimente digitar comandos errados, para ver a mudança no “humor” do smiley.
O código abaixo, exibe uma carinha um pouco diferente para cada tipo de “humor”:

PS1="\`if [ \$? = 0 ]; then echo \\\^\\\_\\\^; else echo \\\-\\\_\\\-; fi\`*\u \w:\h)"

Uma variação deste prompt, exibe um smiley mais simples:

PS1="\t \w \`if [ \$? = 0 ]; then echo \:\); else echo \:\(; fi\` " 

Os próximos exemplos usam smileys coloridos:

PS1="\[\e[01;32m\]\u@\h \[\e[01;34m\]\W \`if [ \$? = 0 ]; then echo -e '\e[01;32m:)'; else echo -e '\e[01;31m:('; fi\` \[\e[01;34m\]$\[\e[00m\]"

A configuração abaixo acrescenta o número do comando no histórico, no começo da linha.

PS1="\`if [ \$? = 0 ]; then echo \[\e[33m\]^_^\[\e[0m\]; else echo \[\e[31m\]O_O\[\e[0m\]; fi\`[\u@\h:\w]\\$ "

Se quiser saber mais sobre as cores e seus códigos, clique aqui.
Prompts em múltiplas linhas, podem conter uma quantidade maior de informações. Por outro lado, alguns usuários acham que isto polui o visual do terminal, que deveria ser um pouco mais espartano.
exemplo de prompt de comando
Se você não se importa com uma ou duas linhas a mais no prompt, mas prefere obter algumas informações imediatas, o exemplo que segue exibe o número de arquivos presentes no diretório atual e o espaço ocupado por eles.

PS1="\n\[\033[35m\]\$(/bin/date)\n\[\033[32m\]\w\n\[\033[1;31m\]\u@\h: \[\033[1;34m\]\$(/usr/bin/tty | /bin/sed -e 's:/dev/::'): \[\033[1;36m\]\$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') files \[\033[1;33m\]\$(/bin/ls -lah | /bin/grep -m 1 total | /bin/sed 's/total //')b\[\033[0m\] -> \[\033[0m\]"

Ao contrário do anterior, este é simples (espartano), só que usa cores. Você pode usá-lo, como base, para criar algo mais sofisticado.

PS1="\[\033[35m\]\t\[\033[m\]-\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ "

Segue uma versão minimalista em 2 linhas:

PS1="[\[\033[32m\]\w]\[\033[0m\]\n\[\033[1;36m\]\u\[\033[1;33m\]-> \[\033[0m\]"

Gosto muito desta versão, abaixo, com informações sobre o diretório atual e sem excesso de cores:

PS1="\n\[\e[30;1m\]\[\016\]l\[\017\(\[\e[34;1m\]\u@\h\[\e[30;1m\])-(\[\e[34;1m\]\@ \d\[\e[30;1m\])->\[\e[30;1m\]\n\[\016\]m\[\017\]-(\[\[\e[32;1m\]\w\[\e[30;1m\])-(\[\e[32;1m\]\$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') files, \$(/bin/ls -lah | /bin/grep -m 1 total | /bin/sed 's/total //')b\[\e[30;1m\])--> \[\e[0m\]"

Atualmente, gosto do meu assim:

PS1="\n\[\e[34;1m\]\u@\h\[\e[30;1m\] \[\e[34;1m\][ \d, \@]\[\e[30;1m\]\n\[\e[30;1m\]kernel: \$(/bin/uname -r)\n\[\e[32;1m\]\w\[\e[30;1m\] (\[\e[34;1m\]\$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') arquivos, \$(/bin/ls -lah | /bin/grep -m 1 total | /bin/sed 's/total //')b\[\e[30;1m\])--> \[\e[0m\]"

Referências

https://slashdot.org/comments.pl?sid=108424&cid=9219400.
https://www.maketecheasier.com/8-useful-and-interesting-bash-prompts/.

Conteúdo relacionado pelo Google

Como personalizar o prompt da linha de comando no UNIX/Linux — parte 4

A personalização do prompt da linha de comando pode ir além de todas aquelas as informações sobre o sistema antes do cursor.
Se você prefere ter menos “coisas” no prompt, mas não quer abrir mão de algumas informações, saiba que é possível enviar alguns destes itens para a barra de títulos do console.
Tudo o que você precisa é acrescentar um pouquinho de código ao que você já tem no seu PS1 — como foi abordado na parte 1, parte 2 e parte 3 desta série de artigos.
O pedaço de código a mais segue aí, embaixo:

"\e]2;texto para a barra de titulo\a"

Basta substituir a cadeia “texto para a barra de titulo” pelo que você achar melhor.
O código para inserir data e hora na barra de título segue abaixo:

\e]2;\d, \t - \u@\h\a

Para ter efeito imediato, acrescente este código ao valor do seu PS1, conforme destacado, abaixo:

PS1='\e]2;\d, \t - \u@\h\a \[\e[0;33m\][\T]\n\[\e[1;36m\] \w > \[\e[0;32m\]'

data hora barra de título

Obviamente, o recurso nem sempre vai funcionar. Quando você estiver usando uma interface 100% caractere (CLI), conectado remotamente a um sistema headless ou, simplesmente, usando o terminal em tela cheia (F11), por exemplo.
Nestes casos, não será possível ver qualquer barra de títulos.

Conteúdo relacionado pelo Google