quinta-feira, 15 de janeiro de 2026

VMD no Linux - Instalação e configuração


INTRODUÇÃO

A concretização deste curto artigo demorou um pouco, mas a idéia já vicejava há algum tempo.

Utilizei o Debian para a instalação, mas pode ser utilizada outra distribuição adaptando-se os respectivos comandos e dependências.

Como sempre, leia todo este singelo texto antes de sair executando comandos.

* Esta é uma atualização do artigo de 2014 em:

https://www.vivaolinux.com.br/artigo/VMD-no-Debian-Instalacao-e-configuracao/


VMD

O VMD (Visual Molecular Dynamics) é um software projetado para modelagem, visualização e análise de sistemas biológicos, tais como proteínas, ácidos nucleicos, montagens lipídicas em bicamadas, etc, mas também pode ser utilizado para visualizar moléculas mais gerais.

O VMD pode ler arquivos de proteínas padrão e exibir a sua estrutura. O VMD fornece uma ampla variedade de métodos de renderização e colorização de moléculas: pontos e linhas simples, esferas e cilindros de CPK, tubos de backbone, desenhos animados e outros.

O VMD pode ser usado para animar e analisar a trajetória de uma simulação de dinâmica molecular (DM).

Em particular, o VMD pode atuar como uma interface gráfica de um programa externo de dinâmica molecular, exibindo e animando uma determinada molécula.


INSTALAÇÃO

Site do VMD:

https://www.ks.uiuc.edu/Research/vmd/

Para fazer o download do VMD, acesse o link:

https://www.ks.uiuc.edu/Development/Download/download.cgi?UserID=&AccessCode=&ArchiveID=1730

Ou

https://www.ks.uiuc.edu/Development/Download/download.cgi?PackageName=VMD

Após clicar em um dos links, faça o registro, logue-se, aceite a licença e faça o download.

Salve o arquivo em um diretório de sua escolha, atualize o sistema e instale as dependências:

# apt update
# aptitude safe-upgrade
# apt install binutils kmod
# apt install csh tcsh
# apt install libstdc++6
# apt install rlwrap

Após entrar no diretório onde salvou o arquivo descompacte e instale:

# cd VMD (por exemplo, eu criei uma pasta chamada VMD)
# tar -xzvf vmd-2.0.0a8.bin.LINUXAMD64.tar.gz
# cd vmd-2.0.0a8

Depois faça:

# ./configure
using configure.options: LINUXAMD64 OPENGL OPENGLPBUFFER FLTK TK ACTC CUDA CXX11 IMD LIBSBALL XINERAMA XINPUT LIBTACHYON LIBPNG ZLIB VRPN NETCDF COLVARS TCL PYTHON PTHREADS NUMPY SILENT

# cd src

# make install
Make sure /usr/local/bin/vmd is in your path.
VMD installation complete.  Enjoy!

Execute:

# vmd

... e deverão abrir as janelas do VMD.


CONFIGURAÇÃO

Caso apareça o seguinte erro: rlwrap: No match.

Edite o arquivo:

# vim /usr/local/bin/vmd

Usei o vim, uses teu editor preferido.

Dentro do arquivo, encontre esse bloco (aproximadamente a partir linha 343):

# detect if we have rlwrap available to have commandline editing
set vmdprefixcmd=""
if ($?VMDNORLWRAP == 0) then
  if (("${ARCH}" == "LINUX") || ("${ARCH}" == "LINUXAMD64")) then
    set rlwrap=`which rlwrap`
    if ( -x "$rlwrap" ) then
      if ( -f ${MASTERVMDDIR}/vmd_completion.dat ) then
        set vmdprefixcmd="rlwrap -C vmd -c -b(){}[],&^%#;|\\ -f ${MASTERVMDDIR}/vmd_completion.dat "
      else 
        set vmdprefixcmd="rlwrap -C vmd -c -b(){}[],&^%#;|\\ "
      endif
      # indicate that rlwrap is in use to cause VMD to 
      # auto-disable internal line editing features since rlwrap is active
      setenv VMDRLWRAPINUSE 1
    endif
  endif
endif


E deixe ele assim:


# detect if we have rlwrap available to have commandline editing

set vmdprefixcmd=""
if ($?VMDNORLWRAP == 0) then
  if (("${ARCH}" == "LINUX") || ("${ARCH}" == "LINUXAMD64")) then
    set rlwrap=`which rlwrap`
    if ( -x "$rlwrap" ) then
      if ( -f ${MASTERVMDDIR}/vmd_completion.dat ) then
#        set vmdprefixcmd="rlwrap -C vmd -c -b(){}[],&^%#;|\\ -f ${MASTERVMDDIR}/vmd_completion.dat "
        set vmdprefixcmd="rlwrap -C vmd -c -f ${MASTERVMDDIR}/vmd_completion.dat "
      else 
#        set vmdprefixcmd="rlwrap -C vmd -c -b(){}[],&^%#;|\\ "
        set vmdprefixcmd="rlwrap -C vmd -c "
      endif
      # indicate that rlwrap is in use to cause VMD to 
      # auto-disable internal line editing features since rlwrap is active
      setenv VMDRLWRAPINUSE 1
    endif
  endif
endif

Basicamente, comente as duas linhas indicadas colocando um # na frente delas e acrescente as outras duas embaixo de cada uma, respectivamente.

O problema está na flag -b, seguida pela expressão regular -b(){}[],&^%#;|\\ , é só suprimí-las e o VMD funcionará normalmente no Debian.

O aviso aparenta ser um problema do CSH, que não consegue interpretar a expressão regular, por isso o aviso rlwrap: No match, ou seja, rlwrap: não combina, não corresponde.

Entrei no arquivo /usr/bin/rlwrap para encontrar a correspondência da expressão, porém, o mesmo é um arquivo binário e como não tem necessidade destrinchá-lo, encontrei a solução nesse link (http://www.ks.uiuc.edu/Research/vmd/mailing_list/vmd-l/19158.html).

O rlwrap (readline wrapper) executa um comando especifico, interceptando a entrada do usuário a fim de fornecer a edição de uma linha, a história persistente e a conclusão. Resumindo, o rlwrap, grosso modo, faz com que o comando vmd seja devidamente interpretado no terminal, sendo que a execução do VMD se dá de forma completa, mesmo com as alterações feitas.

Maiores informações:

# man rlwrap

Faça as alterações, salve, saia do arquivo e execute:

# vmd

... que deverão abrir as janelas do VMD.

Enjoy.

Para remover, entre nos diretórios:

/usr/local/bin e /usr/local/lib.

Delete a pasta vmd, em cada um deles.

E instale uma nova versão, caso queira.


TRABALHANDO NATIVAMENTE COM LOGS NO LINUX

 


INTRODUÇÃO

A maioria das distribuições Linux (www.vivaolinux.com.br/linux/) já tem um controle nativo dos arquivos de logs, mas ele depende de como o sistema está configurado.

Algum ou outro programa pode instalar seu log em outro lugar que não /var/log ou você mesmo durante a instalação manual pode ter colocado o arquivo de log em outro lugar.

A maioria das distribuições Linux não gera um número fixo de arquivos de log, pois utiliza o diretório centralizado (/var/log) onde o sistema operacional, o kernel e os aplicativos instalados criam seus arquivos e o próprio sistema gerencia isso.

Caso tenha um crescimento exagerado e por "crescimento exagerado" estou falando de coisa de GBs para cima, então é porque tem algum problema no sistema e você terá de identificar qual o problema de o sistema aumentar exageradamente os logs ou um log em específico.

Nas distribuições que tem o Systemd , quem controla logs no Linux hoje é o systemd-journald , no caso, Debian, Arch, Ubuntu, Mint, etc.

Nas distribuições que não tem o Systemd , como, por exemplo, Slackware, Gentoo, Alpine, Void Linux, etc, entra um desses: syslog-ng, rsyslog, busybox, syslogd (sistemas mínimos) e metalog (menos comum), além de outros específicos de cada distribuição.

O logrotate (logs em arquivos texto), comum na esmagadora maioria das distribuições com ou sem
Systemd, cuida de logs como:

/var/log/syslog
/var/log/auth.log
/var/log/apache2/*.log
/var/log/nginx/*.log

O logrotate gira logs (rotate), compacta (.gz), apaga logs antigos, roda automaticamente (cron ou systemd timer), etc. A configuração fica, basicamente, em /etc/logrotate.conf e /etc/logrotate.d/.

Uma boa prática básica para servidor é definir limites no /etc/systemd/journald.conf , por exemplo:

SystemMaxUse=100M
SystemKeepFree=1G

E confiar no logrotate para o resto.

Sem Systemd podemos definir limites em /etc/logrotate.conf:

# see "man logrotate" for details
# global options do not affect preceding include directives
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# use date as a suffix of the rotated file
#dateext
# uncomment this if you want your log files compressed
#compress
# packages drop log rotation information into this directory
include /etc/logrotate.d
# system-specific logs may also be configured here.

Nível do artigo: Básico.

VERIFICANDO E CONFIGURANDO LOGS

Faça o seguinte, primeiro veja quantos arquivos de logs tem no sistema:

$ ls /var/log | wc -l
52

Aqui deu 52 arquivos de logs.

Depois veja o tamanho (em -52 você pode colocar -10, -20, etc, depende de quantos arquivos você quer
visualizar):

$ sudo du -sh /var/log/* | sort -hr | head -52

[sudo] senha para usuario:
309M/var/log/journal
17M/var/log/installer
644K/var/log/chrony
412K/var/log/apt
176K/var/log/wtmp
136K/var/log/dpkg.log.5.gz
120K/var/log/dpkg.log.1
108K/var/log/apache2
96K/var/log/dpkg.log.7.gz
88K/var/log/dpkg.log
80K/var/log/cups
44K/var/log/exim4
36K/var/log/lightdm
32K/var/log/Xorg.0.log.old
32K/var/log/Xorg.0.log
28K/var/log/Xorg.1.log
16K/var/log/dpkg.log.4.gz
12K/var/log/dpkg.log.3.gz
12K/var/log/dpkg.log.2.gz
12K/var/log/aptitude
8,0K/var/log/fontconfig.log
8,0K/var/log/dpkg.log.6.gz
8,0K/var/log/boot.log.7
8,0K/var/log/boot.log.6
8,0K/var/log/boot.log.5
8,0K/var/log/boot.log.4
8,0K/var/log/boot.log.3
8,0K/var/log/boot.log.2
8,0K/var/log/boot.log.1
8,0K/var/log/alternatives.log.7.gz
8,0K/var/log/alternatives.log.5.gz
4,0K/var/log/README
4,0K/var/log/lastlog
4,0K/var/log/aptitude.6.gz
4,0K/var/log/aptitude.5.gz
4,0K/var/log/aptitude.4.gz
4,0K/var/log/aptitude.3.gz
4,0K/var/log/aptitude.2.gz
4,0K/var/log/aptitude.1.gz
4,0K/var/log/alternatives.log.6.gz
4,0K/var/log/alternatives.log.4.gz
4,0K/var/log/alternatives.log.3.gz
4,0K/var/log/alternatives.log.2.gz
4,0K/var/log/alternatives.log.1
4,0K/var/log/alternatives.log
0/var/log/speech-dispatcher
0/var/log/runit
0/var/log/private
0/var/log/faillog
0/var/log/btmp.1
0/var/log/btmp
0/var/log/boot.log

Repare que aqui, no Debian, essa instalação já tem mais de dois anos e nunca fiz controle nenhum dos logs.
O maior log, com 309M, é /var/log/journal e não é grande.

Quer ver todos os logs, pelo menos os do sistema, execute:

$ cd /var/log
$ ls
alternatives.logaptitude.3.gzbtmp.1fontconfig.log
alternatives.log.1aptitude.4.gzchronyinstaller
alternatives.log.2.gzaptitude.5.gzcupsjournal
alternatives.log.3.gzaptitude.6.gzdpkg.loglastlog
alternatives.log.4.gzboot.logdpkg.log.1lightdm
alternatives.log.5.gzboot.log.1dpkg.log.2.gzprivate
alternatives.log.6.gzboot.log.2dpkg.log.3.gzREADME
alternatives.log.7.gzboot.log.3dpkg.log.4.gzrunit
apache2boot.log.4dpkg.log.5.gzspeech-dispatcher
aptboot.log.5dpkg.log.6.gzwtmp
aptitudeboot.log.6dpkg.log.7.gzXorg.0.log
aptitude.1.gzboot.log.7exim4Xorg.0.log.old
aptitude.2.gzbtmpfaillogXorg.1.log

Para ver quanto espaço em disco cada item dentro de /var/log está usando:
$ sudo du -sh /var/log/*

sudo - executa como administrador (necessário porque alguns logs só o root pode ler)
du (disk usage) → calcula o uso de disco
-s (summary) - mostra apenas o total de cada item, sem detalhar subpastas
-h (human-readable) - formata os tamanhos de forma legível (KB, MB, GB)
/var/log/* - todos os arquivos e diretórios dentro de /var/log

Para ver os 10 maiores ordenando do maior para o menor:
$ sudo du -sh /var/log/* | sort -hr | head -n 10

309M/var/log/journal
17M/var/log/installer
644K/var/log/chrony
412K/var/log/apt
176K/var/log/wtmp
136K/var/log/dpkg.log.5.gz
120K/var/log/dpkg.log.1
108K/var/log/apache2
96K/var/log/dpkg.log.7.gz
88K/var/log/dpkg.log

Lembrando que algum ou outro programa pode instalar seu log em outro lugar que não /var/log ou você mesmo durante a instalação manual pode ter colocado o arquivo de log em outro lugar.

A maioria das distribuições Linux, não gera um número fixo de arquivos de log, pois utiliza o diretório centralizado (/var/log) onde o sistema operacional, o kernel e os aplicativos instalados criam seus arquivos e o próprio sistema gerencia isso.

Caso tenha um crescimento exagerado e por "crescimento exagerado" estou falando de coisa de GBs para cima, então é por que tem algum problema no sistema e você terá de identificar qual o problema de o sistema aumentar exageradamente os logs ou um log em específico.

Por exemplo, no meu caso, o maior dos logs é /var/log/journal.

Nesse caso posso editar o arquivo de configuração:

$ sudo vim /etc/systemd/journald.conf

Usei o vim , use teu editor preferido.

Veja as opções abaixo, que nem estão configuradas, mas, por exemplo, em "SystemMaxUse=" podemos definir o tamanho máximo total para os logs (500M para 500MB, 1G para 1GB, etc).

[Journal]
#Storage=auto
#Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitIntervalSec=30s
#RateLimitBurst=10000
#SystemMaxUse=
#SystemKeepFree=
#SystemMaxFileSize=
#SystemMaxFiles=100
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
#MaxRetentionSec=0
#MaxFileSec=1month
#ForwardToSyslog=no
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg
#MaxLevelSocket=debug
#LineMax=48K
#ReadKMsg=yes
#Audit=yes

Depois de alterar o arquivo, salve e saia.

Reinicie o serviço:
$ sudo systemctl restart systemd-journald

Para ver quanto ele está usando:
$ journalctl --disk-usage
Hint: You are currently not seeing messages from other users and the system.
Users in groups 'adm', 'systemd-journal' can see all messages.
Pass -q to turn off this notice.
Archived and active journals take up 59.5M in the file system.

Diz que está usando 59.5M, porém, com o comando "du" mostra 309M.

É que o comando "journalctl --disk-usage" mostra apenas o espaço que o journald considera válido e utilizável, enquanto que o comando "du" soma todo o espaço ocupado no disco pelo diretório incluindo arquivos .journal ativos, arquivos arquivados, arquivos já marcados como deletados mas ainda abertos pelo systemd-journald e overhead do filesystem (blocos alocados), etc.
O journalctl mostra o uso lógico, não o físico.

Reiniciando o journald, os valores ficarão praticamente iguais:
$ sudo systemctl restart systemd-journald

$ sudo du -sh /var/log/journal
309M /var/log/journal

$ sudo journalctl --disk-usage
Archived and active journals take up 308.4M in the file system.

$ journalctl --disk-usage
Hint: You are currently not seeing messages from other users and the system.
Users in groups 'adm', 'systemd-journal' can see all messages.
Pass -q to turn off this notice.
Archived and active journals take up 59.5M in the file system.

Veja que o comando journalctl com sudo mostra um valor (308.4M) e sem sudo mostra 59.5M.
Na saída sem o sudo está a explicação dizendo que não estamos vendo as mensagens dos outro usuários e do sistema. Para ver todo o tamanho é só usar sudo.

Para reduzir o tamanho para 100M:
$ sudo journalctl --vacuum-size=100M

Ou só últimos 7 dias:
$ sudo journalctl --vacuum-time=7d

Para mais opções:
$ man journalctl


CONFIGURANDO LOGS

Também pode configurar alguns logs do sistema em logrotate.d .
Vá em /etc/logrotate.d/ e edite os arquivos (apache2, aptitude, etc).

$ cd /etc/logrotate.d
$ ls
alternatives  aptitude  chrony       exim4-base      sane-utils         wtmpdb
apache2       bootlog   cups-daemon  exim4-paniclog  speech-dispatcher
apt           btmp      dpkg         ppp             wtmp


Por exemplos:

$ sudo vim aptitude
/var/log/aptitude {
rotate 6
monthly
compress
missingok
notifempty
}

$ sudo vim apt
/var/log/apt/term.log {
rotate 12
monthly
compress
missingok
notifempty
}

/var/log/apt/history.log {
rotate 12
monthly
compress
missingok
notifempty
}

$ sudo vim apache2
/var/log/apache2/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then
run-parts /etc/logrotate.d/httpd-prerotate
fi
endscript
postrotate
if pgrep -f ^/usr/sbin/apache2 > /dev/null; then
invoke-rc.d apache2 reload 2>&1 | logger -t
apache2.logrotate
fi
endscript
}

Dependendo do log, tem diferenças entre as opções, mas, basicamente, são as mesmas.
Abaixo temos algumas indicações das opções:

    daily          # Rotação diária
    monthly	   # Rotação mensal
    rotate 7       # Mantém 7 arquivos antigos
    compress       # Comprime logs antigos (gzip)
    delaycompress  # Comprime o arquivo anterior
    missingok      # Não gera erro se o arquivo não existir
    notifempty     # Não rotaciona se vazio
    size 100M      # (Opcional) Rotaciona se o arquivo atingir 100MB


CONCLUSÃO

A maioria das distribuições Linux já tem um controle nativo dos arquivos de logs, mas ele depende de como o sistema está configurado.

Nas distribuições que tem o Systemd , quem controla logs no Linux hoje é o systemd-journald , no caso, Debian, Arch, Ubuntu, Mint, etc.

Nas distribuições que não tem o systemd, como, por exemplo, Slackware, Gentoo, Alpine, Void Linux, etc, entra um desses: syslog-ng, rsyslog, busybox, syslogd (sistemas mínimos) e metalog (menos comum), além de outros específicos de cada distribuição.

O logrotate (logs em arquivos texto), comum na esmagadora maioria das distribuições com ou sem systemd, cuida de logs como:

/var/log/syslog
/var/log/auth.log
/var/log/apache2/*.log
/var/log/nginx/*.log

O logrotate gira logs (rotate), compacta (.gz), apaga logs antigos, roda automaticamente (cron ou systemd timer), etc. A configuração fica, basicamente, em /etc/logrotate.conf e /etc/logrotate.d/ .

Pessoalmente, só acredito ser necessário alterar configurações dos logs caso for um servidor que lida com grandes cargas de dados, então se faz necessário configurar os logs para ter um melhor controle.

Caso for desktop, somente se faz necessário alterar essas configurações caso tenha algum programa específico que gere logs muitos grandes, senão não altere, deixe tudo no padrão e não se preocupe com isso, apenas monitore de vez em quando para ver se não tem algum problema.

Quando tiver um crescimento exagerado dos logs então é porque tem algum problema sério no sistema e você deverá identificá-lo e corrigi-lo.

quarta-feira, 7 de janeiro de 2026

Vícios


O corpo humano cria tolerância e depois vem a dependência.

Aquilo que chamam de vício ou dependência química.

Ninguém se vicia em alguma coisa de uma hora para outra.

O processo leva dias, meses ou anos, depende da genética da pessoa.

Ninguém fuma o primeiro cigarro na vida hoje; e amanhã está fumando três carteiras.

Ninguém toma o primeiro gole de bebida alcoólica hoje; e amanha está literalmente bebendo três garrafas de cachaça.

O processo de vício é ao longo do tempo.

A coisa resume-se em três fases: Dependência Psicológica, Tolerância e Dependência Física.

Primeiro você se vicia psicologicamente, você se apega psicologicamente à substância externa; depois vem a Tolerância porque o corpo humano é programado para tolerar qualquer substância que você ingere. Por último, vem a Dependência Física, ou seja, o corpo não vive mais sem aquela substância externa.

O que chamam atualmente de "Dependência Química" ou "Vício" é a soma desses três processos.

Vamos discorrer sobre os processos.


1 - Dependência Psicológica

Dizem que o vício é uma fuga... e realmente é.
Você começa a beber, por exemplo, umas vezes por convenção social, aprendeu com os pais, com mais velhos, etc.
Começa a beber e nem sabe o porquê.
No começo é bom porque todo vício é gostoso e por isso mesmo é vício, senão não seria vício. Não estou dizendo que toda coisa gostosa é vício, mas é uma característica do vício ser gostoso, ser bom.

Esse é o problema do vício.

Tomarei como exemplo o álcool que, segundo dizem, é o pior dos vícios... e realmente o é.

O álcool age sub-repticiamente, age nas entrelinhas.
Porém, existem diferenças entre os vícios, diferenças estas causadas pela própria substância física causadora do vício em si, o que é óbvio.
Você fuma ou bebe ou ingere (ingere é o termo geral) uma substância causadora de vício.

Substância causadora de vício é aquela substância externa ou interna que o corpo se acostuma com ela e depois cria Tolerância e depois Dependência Física.

Por exemplo, a adrenalina é uma substância naturalmente interna, mas pode-se viciar nela através de fortes emoções (causador externo).
Também pode-se viciar em adrenalina externa (ingerir produtos que tem adrenalina na sua composição). Que fique bem claro a diferença entre substância externa e interna.

Seguindo no exemplo do álcool, você começa a beber um golezinho todos os dias ou nos fins de semana e sente-se bem, isso é inegável.

O problema é justamente esse: "sente-se bem".

A partir daí um gole já não faz mais efeito, precisa-se de dois goles e depois de três goles e assim sucessivamente. Quando você percebe, depois de dias, semanas, meses, anos, você está bebendo três ou quatro garrafas de cachaça por dia, ou três garrafas de uísque, dependendo da sua condição financeira. O seu corpo começa a criar a Tolerância porque o corpo humano é programado para não morrer, então ele se adapta.

Com a maconha, cocaína, crack, heroína, etc, acontece a mesma coisa, porém, o processo é mais rápido em relação ao álcool porque são substâncias diferentes.

Torna-se necessário esclarecer o que é aquilo que o ser humano chama de "drogas".

Aquilo que o ser humano chama de "Drogas" são substâncias que não são nutrientes em si, algumas drogas até contém nutrientes, porém, não são nutrientes em si.

Você come um prato de comida e esse prato de comida causa uma reação química/física no seu corpo, mas você não chama um prato de comida de "droga" porque isso não te entorpece, isso não age diretamente no seu cérebro alterando seu entendimento da realidade.
O seu corpo identifica se é um nutriente ou não. Caso não for, ele elimina através de fezes, urina, suor ou vômito.

Tudo o que o ser humano ingere causa uma reação química/física. Não vou aqui discorrer a diferença entre reação química e física.

Você bebe um copo de água, isso causa uma reação química no seu corpo, porém, não classificamos o copo de água como uma "droga".

"Droga" é tudo aquilo que causa uma reação direta no cérebro, ou seja, tira a sua percepção da realidade, seja em curto, médio ou longo prazo.
Nós, seres humanos, classificamos as drogas devido aos seus efeitos no corpo humano.
Maconha, álcool, cigarro, cocaína, crack, heroína, ópio, etc. Cada uma tem seu ritual próprio de uso e tem seus próprios efeitos. O ritual de uso é definido pela droga em si, o que é óbvio. Maconha se fuma, cocaína se cheira, álcool se bebe e assim por diante.
Por exemplo, geralmente aquelas pessoas que gostam de tomar sua cervejinha praticamente todos os dias abominam drogas como maconha e cocaína e não consideram o álcool uma droga.
E geralmente aquelas pessoas que gostam de fumar seu baseado praticamente todos os dias abominam os alcoólatras e não consideram a maconha uma droga.

Primeiro você se vicia Psicologicamente, isso é óbvio.

Repito: ninguém toma um gole de cerveja, fuma um cigarro, etc, hoje; e amanhã está consumindo uma quantidade exagerada.

Até porque se isso acontecesse daria o efeito contrário.

Por exemplo: se você pega teu filho adolescente fumando um cigarro e o tranca num armário e diz para ele: "Você só vai sair daí quando fumar toda essa carteira de cigarro!".

Caso teu filho achar bom e começar a fumar cigarros dentro de um armário fechado, dará o efeito contrário. Ele passará mal, baterá na porta gritando que quer sair, etc.

Não estou sugerindo que é isso que se faça, mas todo vício, por agir aos poucos, a melhor forma de combater no início, algumas vezes, seria fazer consumir a substância exageradamente em pouquíssimo tempo, porém, os danos físicos dessa prática podem ser permanentes, o risco é muito grande.

Estamos discorrendo sobre Dependência Psicológica, mas as três estão entranhadas.

Muitas vezes discorre-se sobre uma e tem de se dizer das outras.

Você se apega psicologicamente à substância química.

"Psicologia" é o estudo da alma. "Psiqué".

E essa substância passa a fazer parte da sua vida.

Você acredita que tem controle sobre ela, mas não tem.

Primeiro você se apega à substância porque é bom, é confortável, muitas vezes realmente esclarece as idéias, mas esse é o problema do vício.

Permito agora dizer de Aristóteles: a Temperança!

Platão e Sócrates, anteriormente, também falavam da Temperança.

Temperança tem nada a ver com "estar em cima do muro", tem nada a ver com "ser isentão".

Temperança, neste sentido, é estar consciente de que você está se viciando.

No momento em que você diz que tem controle sobe o vício, VOCÊ NÃO TEM.

As pessoas se viciam pelos mais diversos motivos, desde o tédio da falta do que fazer até a depressão clínica, passando pelos mais diversos motivos.
Tem pessoas que são viciadas em comer, por exemplo. Outras são viciadas em masturbação. Talvez os motivos que levam a um determinado tipo de vício sejam iguais no seu início.

Em construção, ainda terminarei esse escrito, está longe do fim.

domingo, 4 de janeiro de 2026

Executar Scripts Remotamente

Introdução

Muitas vezes, em uma rede, laboratório ou em um cluster (ou até mesmo de um único computador para outro), é necessário rodar um script remotamente e temos de contornar a senha do SSH. Com o presente artigo e os scripts adiante, executaremos scripts remotamente.

Pode parecer uma falha de segurança, mas quando se trabalha com vários computadores em rede torna-se contraproducente ficar digitando a senha do SSH repetidas vezes, mas basta ter cuidado, pois trata-se de script para execução interna na rede/laboratório/cluster.

Além disso, temos dois scripts: um com senha SSH e outro somente com chave SSH (mais seguro). Utilize o que for mais conveniente para você. Use um ou outro, pois depende de como você configurou o SSH: com chave (mais seguro) ou com senha.

Não colocarei aqui como executar através do Linux um script/batch no Windows, pois não é o escopo do artigo.

A lógica é bem simples: coloque nos scripts executa-geral-senha.sh ou executa-geral-chave.sh o caminho e o nome do script que você quer executar remotamente.

Caso os dois scripts, o chamado e o chamador, façam conexões SSH dará erro e/ou pedirá senha em cima de senha; isso não é incontornável no Linux, mas para o que se pretende não vale a pena o trabalho.

Como bônus, deixo ao final o script copia-chave-distros.sh que deve ser executado diretamente no terminal com:

./copia-chave-distros.sh.

Tal script copia as chaves SSH, cria remotamente o arquivo /etc/sudoers.d/usuario e configura esse arquivo com ALL=(ALL) NOPASSWD: ALL e Defaults:usuario !requiretty.

Temos quatro seções no artigo:
1- Seção do script com senha;
2- Seção do script com chave;
3- Como utilizar os scripts e
4- Bônus.


Nível: Intermediário.

E, como sempre, respeitando a Velha Máxima casada com o Velho Ditado: tenha a decência de ler todo o artigo antes de sair executando comandos!


1 - Seção do Script com Senha (OPÇÃO COM SENHA SSH)

Crie o script:

$ sudo vim $HOME/caminho_diretorio/scripts/executa-geral-senha.sh

Usei o vim, use teu editor preferido e adapte o caminho para salvar o script de acordo com as tuas necessidades.

Coloque dentro (copie e cole o código):

#!/bin/bash

# ============================================
# Executa outros scripts por SSH com senha
# Compatível com Debian | Fedora | RHEL | Arch
# e derivados
# ============================================

# Caminho do script local a ser executado remotamente (modifique aqui)
SCRIPT_PATH="$HOME/caminho_diretorio/scripts/script.sh"

# Verifica se o script existe
if [ ! -f "$SCRIPT_PATH" ]; then
    echo "Script local não encontrado: $SCRIPT_PATH"
    exit 1 # Encerra o script caso o arquivo não exista
fi

# Extrai o nome do script do caminho
SCRIPT="$(basename "$SCRIPT_PATH")"
DESTINO="/opt/scripts/$SCRIPT"

# Senha sudo (texto plano - cuidado em ambientes sensíveis)
SENHA="senha"

# Lista de hosts/nós (modifique conforme necessário)
# Para vários hosts/nós: ("no01" "no02" "no03" "no04" ...)
NODES=("no01")

# Loop sobre cada host/nó
for NODE in "${NODES[@]}"; do
    echo ">>> Enviando $SCRIPT para $NODE..."

    # Copia o script para /tmp
    scp "$SCRIPT_PATH" "$NODE:/tmp/" || {
        echo -e "\033[1;31mFalha ao copiar para $NODE!\033[0m"
        continue
    }

    # Move para /opt com sudo, torna executável
    ssh "$NODE" "echo \"$SENHA\" | sudo -S mkdir -p /opt/scripts && sudo mv /tmp/$SCRIPT $DESTINO && sudo chmod +x $DESTINO; echo"

    # Executa o script remotamente com ou sem argumento adicional
    # Caso quiser colocar argumentos adicionais, se souber o que está fazendo
    # Senão deixe como está
	if [ "$SCRIPT" == "pvfs2-dist-keys.sh" ]; then
    		ssh "$NODE" "echo \"$SENHA\" | sudo -S bash $DESTINO /opt/orangefs; echo"
	elif [ "$SCRIPT" == "copia-chave-visudo.sh" ]; then
    		scp ~/.ssh/id_ed25519.pub "$NODE:/tmp/id_ed25519.pub"
    		ssh "$NODE" "echo \"$SENHA\" | sudo -S bash $DESTINO /tmp/id_ed25519.pub"
	else
    		ssh "$NODE" "echo \"$SENHA\" | sudo -S bash $DESTINO"
	fi

    if [ $? -eq 0 ]; then
    # Azul negrito: \033[1;34m
    # Azul forte: \033[38;5;39m
    echo
    echo -e "\033[1;34mSCRIPT EXECUTADO COM SUCESSO EM $NODE!!!\033[0m"
	else
    # Vermelho negrito: \033[1;31m
    echo
    echo -e "\033[1;31mERRO AO EXECUTAR SCRIPT EM $NODE!!!\033[0m"
    continue
fi
    echo
	# === LIMPEZA ===
	# Apaga o script da máquina remota (comente a linha abaixo, caso queira)
	sudo rm -rf /opt/scripts/$SCRIPT
done

Salve e saia.

Dê permissão de execução:

$ sudo chmod +x executa-geral-senha.sh

Para executar no servidor:

$ ./executa-geral-senha.sh

Ou, se for o caso:

$ sudo ./executa-geral-senha.sh


2 - Seção do Script com Chave ( OPÇÃO COM CHAVE SSH)

SCRIPT executa-geral-chave.sh

Agora temos o script executa-geral-chave.sh onde não tem a senha, pois configuramos o SSH para trabalhar com chave (é mais seguro).

Pré-requisitos (feito uma única vez)

Gera chave SSH (se ainda não existir):

$ ssh-keygen -t ed25519


Copia a chave para os hosts/nós:

$ ssh-copy-id usuario@no01


Ou:
$ ssh-copy-id usuario@192.168.1.100


Teste:

$ ssh usuario@no01

Ou:

$ ssh usuario@192.168.1.100

Não pedirá senha.


Configurar sudo sem senha no nó remoto:

$ sudo visudo -f /etc/sudoers.d/usuario


Coloque dentro do arquivo:

$ usuario ALL=(ALL) NOPASSWD: ALL


Crie o arquivo executa-geral-chave.sh (ou dê o nome que quiser) com seu editor de texto preferido e coloque dentro (copie e cole o código):

#!/bin/bash

# ============================================
# Executa outros scripts por SSH com chave
# Compatível com Debian | Fedora | RHEL | Arch
# e derivados
# ============================================

# Requisitos:
# Gere a chave SSH
# $ ssh-keygen -t ed25519
# Copie para os hosts/nós
# $ ssh-copy-id usuario@no01 e/ou ssh-copy-id usuario@192.160.1.100
# Teste:
# ssh usuario@no01 e/ou ssh usuario@192.168.1.100
# Não deve pedir senha
# Configure sudo sem senha no host/nó remoto, somente com chave
# $ sudo visudo -f /etc/sudoers.d/usuario
# Coloque dentro do arquivo
# usuario ALL=(ALL) NOPASSWD: ALL
# Defaults:usuario !requiretty

# Caminho do script local a ser executado remotamente (modifique aqui)
SCRIPT_PATH="$HOME/caminho_diretorio/scripts/script.sh"

# Verifica se o script existe
if [ ! -f "$SCRIPT_PATH" ]; then
    echo "Script local não encontrado: $SCRIPT_PATH"
    exit 1 # Encerra o script caso o arquivo não exista
fi

# Nome do script
SCRIPT="$(basename "$SCRIPT_PATH")"
DESTINO="/opt/scripts/$SCRIPT"

# Lista de hosts/nós (modifique conforme necessário)
# Para vários hosts/nós: ("no01" "no02" "no03" "no04" ...)
NODES=("no01")

# Loop sobre cada host/nó
for NODE in "${NODES[@]}"; do
    echo ">>> Enviando $SCRIPT para $NODE..."

    # Copia script para /tmp
    # scp = secure copy (copia arquivos via SSH)
    # -o BatchMode=yes = evita prompts de senha; falha se não houver autenticação por chave
    scp -o BatchMode=yes "$SCRIPT_PATH" "$NODE:/tmp/" || {
        echo "Falha ao copiar para $NODE"
        continue # Pula para o próximo host/nó em caso de erro
    }

    # Cria o diretório, move e dá permissão
    # ssh = conecta via SSH e executa comandos no host/nó remoto
    # -o BatchMode=yes = impede que ssh peça senha; útil para scripts automatizados
    ssh -t -o BatchMode=yes "$NODE" "
        set -e # encerra o ssh se algum comando falhar
        sudo mkdir -p /opt/scripts # cria diretório de destino se não existir
        sudo mv /tmp/$SCRIPT $DESTINO # move o script para o destino final
        sudo chmod +x $DESTINO # torna o script executável
		
	# Validação do bash, altere para tuas necessidades
    	   if [ ! -x /bin/bash ]; then
        	echo \"Erro: /bin/bash não encontrado ou não executável\"
        	exit 1
    	   fi

    # Executa o script remotamente com ou sem argumento adicional
    # Caso quiser colocar argumento adicional, se souber o que está fazendo
    # Senão deixe como está
    if [ \"$SCRIPT\" == \"pvfs2-dist-keys.sh\" ]; then
        sudo /bin/bash $DESTINO /opt/orangefs
    else
        sudo /bin/bash $DESTINO # executa o script remoto sem argumentos
    fi

    # === LIMPEZA ===
    # Apaga o script da máquina remota após a execução (comente a linha abaixo, caso queira)
    sudo rm -f $DESTINO

    " || {
	# Vermelho negrito: \033[31m
	echo
        echo -e "\033[1;31mERRO AO EXECUTAR NO HOST/NÓ $NODE!!!\033[0m"
        continue # pula para o próximo host/nó em caso de erro
    }
    # Azul negrito: \033[1;34m
    # Azul forte: \033[38;5;39m
    echo
    echo -e "\033[1;34mSCRIPT EXECUTADO COM SUCESSO EM $NODE!!!\033[0m"
    echo
done

Salve e saia.
Dê permissão de execução.


3 - Como Utilizar

Por exemplo, temos o script atualiza-remoto-distros.sh que atualiza o sistema em lote e queremos executá-lo automaticamente em várias máquinas.


SCRIPT atualiza-remoto-distros.sh

#!/bin/bash

# ============================================
# Script de atualização do sistema
# Compatível com Debian | Fedora | RHEL | Arch
# e derivados
# ============================================

# Este script é projetado para ser executado remotamente através do
# script principal executa-geral-senha.sh ou executa-geral-chave.sh (via SSH + sudo).

set -e

echo ">>> Iniciando atualização do sistema..."

# Detecta o gerenciador de pacotes
if command -v apt-get >/dev/null 2>&1; then
    # Verde negrito: \033[1;32m
    echo -e "\033[1;32m>>> Sistema baseado em Debian/Ubuntu detectado!\033[0m"
    export DEBIAN_FRONTEND=noninteractive
    apt-get update
    apt-get upgrade -y
    apt-get autoremove -y

elif command -v dnf >/dev/null 2>&1; then
    echo -e "\033[1;32m>>> Sistema baseado em Fedora/RHEL detectado!\033[0m"
    dnf upgrade -y
    dnf autoremove -y

elif command -v pacman >/dev/null 2>&1; then
    echo -e "\033[1;32m>>> Sistema baseado em Arch Linux detectado!\033[0m"
    pacman -Syu --noconfirm

else
    # Vermelho negrito: \033[1;31m
    echo -e "\033[1;31mGerenciador de pacotes não suportado!\033[0m"
    exit 1
fi

echo ">>> Atualização do sistema concluída com SUCESSO!"

Salve e saia.
Dê permissão de execução.


Basta colocar no script executa-geral-senha.sh ou executa-geral-chave.sh o caminho para o script desejado em:

# Caminho do script local a ser executado remotamente (modifique aqui)
SCRIPT_PATH="$HOME/caminho_diretorio/scripts/atualiza-remoto-distros.sh"

E executar um dos dois scripts chamadores.

A lógica é bem simples: coloque nos scripts executa-geral-senha.sh ou executa-geral-chave.sh o caminho e o nome do script que você quer executar remotamente.


4 - Bônus

SCRIPT copia-chave-distros.sh

#!/bin/bash

# ============================================
# Configura SSH e sudo NOPASSWD
# Compatível com Debian | Fedora | RHEL | Arch
# e derivados
# ============================================

# Antes de executar esse script, você deverá ter gerado a chave no servidor
# Exemplo:
# $ ssh-keygen -t ed25519

CHAVE_PUB="$HOME/.ssh/id_ed25519.pub"
# Configure com seu usuario e senha
USER_REMOTO="usuario"
SENHA="senha"  # senha sudo do usuário remoto

if [ ! -f "$CHAVE_PUB" ]; then
    echo "Chave pública ED25519 não encontrada em $CHAVE_PUB"
    exit 1
fi

echo ">>> Processando nós..."

# Altere para tua faixa de IPs
for i in {4..8}; do
    NODE="192.168.1.$i"
    echo -n "Verificando conectividade com $NODE... "

    if ping -c 1 -W 1 "$NODE" &> /dev/null; then
        echo "OK"
        echo "Copiando chave para $NODE"
        ssh-copy-id -i "$CHAVE_PUB" "$USER_REMOTO@$NODE"
    else
        echo -e "\033[1;31mFalhou conectividade com $NODE!\033[0m"
        continue
    fi

    echo ">>> Configurando sudo NOPASSWD e !requiretty em $NODE..."

    # Cria arquivo sudoers remoto com senha via sudo -S
    ssh "$USER_REMOTO@$NODE" "
        echo '$SENHA' | sudo -S bash -c '
            cat > /etc/sudoers.d/$USER_REMOTO <>> Nó $NODE configurado com sucesso!\033[0m"
    echo
done
# Verde negrito: \033[1;32m
echo -e "\033[1;32m>>> Todos os nós processados com sucesso!\033[0m"
echo

Salve e saia.
Dê permissão de execução.

Lembre que o script copia-chave-distros.sh deve ser executado diretamente no terminal (./copia-chave-distros.sh), pois se chamarmos ele por um dos outros scripts dará erro devido às senhas de sudo, caminhos de arquivos no servidor, etc. Um script remoto nunca pode copiar a chave do servidor por questões de segurança, então o servidor SEMPRE precisa enviar a chave, pois quem deve fazer a conexão SSH é o script chamador.

Caso os dois scripts, o chamado e o chamador, façam conexões SSH dará erro e/ou pedirá senha em cima de senha; isso não é incontornável no Linux, mas para o que se pretende não vale a pena o trabalho.