Como determinar quais portas estão escutando, no Linux, com o comando lsof

O comando lsof, presente no Linux e nos UNIX (o que inclui o MacOS), tem a função de listar arquivos abertos por processos em seu sistema.
Já mostrei como usar o lsof para detectar se algum arquivo aberto impede que você consiga desmontar o seu pendrive (ou qualquer outro dispositivo de armazenamento USB) — se tiver curiosidade, leia este texto.
Também explicamos rapidamente o funcionamento do lsof no post Comandos para obter informações sobre o Ubuntu.
lsof listening ports
O nome do comando é uma abreviação de list opened files — ou “lista arquivos abertos”, em uma tradução livre.
Por “arquivo aberto”, entenda-se um arquivo simples, um diretório, um arquivo especial de bloco, um arquivo especial de caractere, uma referência ao um texto ou a uma biblioteca, um fluxo de dados ou um arquivo de rede etc.
Neste texto vamos mostrar como o lsof pode ser usado para determinar que portas estão abertas e escutando (listening) por conexões.
Se você digitar lsof pura e simplesmente, vai acabar “soterrado” sob uma montanha de informações.
Se for executado sozinho, sem qualquer opção ou parâmetro, o lsof vai exibir todos os arquivos abertos por todos os processos do sistema — o que pode resultar em uma lista bem extensa.
Na maioria das vezes, portanto, é necessário acompanhar a ferramenta do comando grep, para filtrar e descartar dados que não interessaM na nossa listagem.
Veja um exemplo de uso:


sudo lsof -P | grep --color -i listen

[sudo] senha para justincase:          

lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
sshd        508                   root    3u     IPv4              19120      0t0        TCP *:22 (LISTEN)
sshd        508                   root    4u     IPv6              19122      0t0        TCP *:22 (LISTEN)
cupsd     27424                   root    6u     IPv6             371198      0t0        TCP localhost:631 (LISTEN)
cupsd     27424                   root    7u     IPv4             371199      0t0        TCP localhost:631 (LISTEN)

Acima, os números das portas em uso podem ser vistos à esquerda de “(LISTEN)”.
A opção ‘-P’ tem a função de inibir a conversão dos números das portas para nomes de arquivos de rede.
Neste caso, é útil por que força a exibição do número da porta, em vez do serviço que a está usando.
Experimente dar o comando sem a opção ‘-P’, para ver do que estou falando.

Assinar blog por e-mail

Digite seu endereço de e-mail para assinar este blog e receber notificações de novas publicações por e-mail.

Como encontrar e instalar pacotes de softwares para FreeBSD com o pkg

A lista de aplicações disponíveis para FreeBSD cresce a cada dia.
Tal como em outros sistemas operacionais Unix-like, há várias maneiras de encontrar e instalar os pacotes de softwares que você precisa.
O FreeBSD, a exemplo de várias distribuições GNU/Linux, também seus sistemas de gestão de pacotes.

Como buscar os softwares disponíveis no repositório do FreeBSD

Se quiser fazer a busca por pacotes de softwares binários, dentro do repositório oficial, use o utilitário pkg.
Veja um exemplo:

pkg search tetris

Segue a relação de pacotes que contenham, em sua descrição, a string ‘tetris’:

patapizza-tetris-1.0_6         Unofficial clone of the original Tetris game
vitetris-0.57                  Terminal-based Tetris clone in vein of Nintendo Tetris

Na primeira coluna, vem o nome e a versão do pacote. Na segunda coluna, uma breve descrição.
Para obter a informação sobre a categoria a que cada pacote pertence, use a opção -o:

pkg search -o tetris 

Neste caso, todos os pacotes pertencem a categoria (origem) ‘jogos’ e a versão de cada um não será exibida na primeira coluna:

games/patapizza-tetris         Unofficial clone of the original Tetris game
games/vitetris                 Terminal-based Tetris clone in vein of Nintendo Tetris

Ao usar o ‘search’ simples, o gestor de pacotes pode oferecer informações sobre a versão da linguagem de programação (Python, PHP, Ruby, C etc.) sobre a qual aquele pacote foi construído.
No exemplo, abaixo:

pkg search subversion 
git-subversion-2.9.2           Distributed source code management tool with FreeBSD subversion bindings
java-subversion-1.9.4          Java bindings for Version control system
p5-subversion-1.9.4            Perl bindings for Version control system
py27-hgsubversion-1.8.6        Mercurial extension that allows using it as a Subversion client
py27-subversion-1.9.4          Python bindings for version control system
ruby-subversion-1.9.4          Ruby bindings for version control system

Recomendo usar o comando grep para filtrar resultados muito extensos e obter apenas o que necessita:

pkg search mp3 | grep player 
ksmp3play-0.5.2.1_4            Curses-based MP3 player
mp3blaster-3.2.5_5             MP3 console ncurses-based player
ximp3-0.1.15                   Simple console MP3 player

Verifique se há atualizações no FreeBSD com o portmaster

Se você prefere compilar seus softwares a partir do código fonte, usando o sistema de ports, no FreeBSD, uma alternativa atraente é usar o comando portmaster.
Este comando é usado nas tarefas de gestão de software no FreeBSD — para verificar/aplicar atualizações, instalar/remover ports e todas as suas dependências.
Leia mais sobre gestão de pacotes no FreeBSD, com o Portsnap.
Neste post, estou usando exemplos baseados no FreeBSD 10.3 STABLE.
freebsd flat logo bumper badge
Para obter o utilitário portmaster, faça a sua instalação via ports system, se ainda não vez.

Como instalar o portmaster no FreeBSD

Se ainda não tiver o portmaster instalado no sistema, use um destes 2 métodos de instalação.
Para baixar e instalar, via pkg:

sudo pkg install portmaster
Password:
Updating FreeBSD repository catalogue...
Fetching meta.txz: 100%    944 B   0.9kB/s    00:01
Fetching packagesite.txz: 100%    6 MiB   1.5MB/s    00:04
Processing entries: 100%
FreeBSD repository update completed. 25560 packages processed.
Updating database digests format: 100%
New version of pkg detected; it needs to be installed first.
The following 1 package(s) will be affected (of 0 checked):
Installed packages to be UPGRADED:
    pkg: 1.8.7 -> 1.8.7_1
Number of packages to be upgraded: 1
    2 MiB to be downloaded.

Proceed with this action? [y/N]: 

… ou compile a ferramenta, a partir dos fontes. Para isto, vá até o diretório do pacote, na árvore de ports e instale-o com o make:


cd /usr/ports/ports-mgmt/portmaster/ 
sudo make install clean 

freebsd make install clean
Especificamente sobre este processo, o sistema poderá perguntar se você deseja instalar extensões programáveis para uma ou mais shells. Eu optei por não e as desmarquei (figura acima).
É possível ver mensagem sobre adicionar informações ao /etc/make.conf e converter seu banco de dados de pacotes (package database) — o que não é necessário nas versões do FreeBSD 10.1 ou superiores.

Como atualizar o sistema com o portmaster

Uma vez instalado o portmaster, verfique se há atualizações disponíveis:

portmaster -L

Como você pode ver, no exemplo acima, não é necessário ter privilégios administrativos para fazer este procedimento.
O meu resultado (parcial, abaixo), mostra que há 47 atualizações pendentes:

===>>> 47 total installed ports
       ===>>> 2 have new versions available

O portmaster examina todos os softwares instalados no seu sistema e o compara com o arquivo de índice, a procura de novas versões disponíveis.
Funciona como o comando pkg e independe do fato de os softwares terem sido instalados via package ou ports.
No que tange as dependências, ele os categoriza e determina como estão conectados entre si.
Repare a saída (acima) do comando. Todos os que tenham atualização disponível, terão uma linha indentada, em destaque (exemplo abaixo):

===>>> pt-freebsd-doc-48963,1
       ===>>> New version available: pt-freebsd-doc-49071,1

Novamente, você pode optar por um destes 2 métodos de atualização: packages ou portmaster.
Se optar por fazer a atualização através do primeiro, use novamente o comando pkg:

sudo pkg upgrade 
Password: 
Updating FreeBSD repository catalogue...
FreeBSD repository is up-to-date.
All repositories are up-to-date.
Updating database digests format: 100%
New version of pkg detected; it needs to be installed first.
The following 1 package(s) will be affected (of 0 checked):

Installed packages to be UPGRADED:
          pkg: 1.8.7 -> 1.8.7_1

Number of packages to be upgraded: 1

          2 MiB to be downloaded.

Proceed with this action? [y/N]:  

Se você prefere o segundo método, para atualizar todos os ports que necessitam de atualização, use a seguinte opção:

portmaster -aD

Para remover os distfiles velhos, use ‘–clean-distfiles’:

portmaster --clean-distfiles

Fique atento, pois este processo pode pedir sua intervenção algumas ou várias vezes, até ser concluído.

Como instalar aplicativos do Ports Collection no FreeBSD

O sistema operacional FreeBSD, provê o Ports Collection como recurso simplificador da instalação de aplicativos no seu sistema.
Cada port contém todo e qualquer patch necessário para permitir que o código fonte original do software seja compilado — e o binário resultante possa ser executado.
Normalmente, o Ports Collection é selecionado para download, já durante a instalação do sistema. Se isto não foi feito, você terá um diretório /usr/ports vazio.

Como trazer o Ports Collection

Antes de poder usar o recurso, é necessário obter a coleção e guardá-la no diretório /usr/ports.
O comando portsnap, do FreeBSD, automatiza o processo para você — baixando, instalando e, quando necessário, sincronizando o Ports Collection da internet.
Use o ‘fetch’, para pegar “a coleção”:

portsnap fetch
Looking up portsnap.FreeBSD.org mirrors... none found.
Fetching snapshot tag from portsnap.FreeBSD.org... done.
Fetching snapshot metadata... done.
Updating from Wed Jul 20 15:21:53 BRT 2016 to Wed Jul 20 16:36:14 BRT 2016.
Fetching 4 metadata patches... done.
Applying metadata patches... done.
Fetching 0 metadata files... done.
Fetching 5 patches.
(5/5) 100.00%  done.
done.
Applying patches...
done.
Fetching 0 new ports or files... done.

A função deste comando é baixar um snapshot, ou imagem, da árvore de ports ou atualizar o que já existe.
Depois do download/sincronização, é hora de extrair a árvore de ports, colocando cada arquivo em seu lugar.
Note que o comando que segue (extract) só deve ser usado na primeira vez em que você for instalar os Ports Collection em seu sistema — uma vez que ele irá sobrepor todo o conteúdo do /usr/ports e seus subdiretórios.

portsnap extract

O processo pode ser um pouco demorado, a depender da sua conexão.
Se o diretório /usr/ports não estiver vazio, o comando ‘update’ deverá ser usado no lugar do ‘extract’.
Daqui pra frente, em resumo, não use mais o ‘extract’.
O comando ‘update’ pode ser usado para atualizar a árvore de ports previamente extraída.
É necessário rodar este comando para aplicar as mudanças feitas aos ports, após os downloads de atualizações através do ‘fetch’ ou do ‘cron’.
Este comando sobrescreve o conteúdo preexistente.

portsnap update
portsnap update 
Removing old files and directories... done.
Extracting new files:
/usr/ports/devel/avro-c/
 ...
/usr/ports/net/ntpa/
Building new INDEX files...  

Como encontrar aplicativos para instalar no FreeBSD

Você pode pesquisar dentro dos ports ou dentro do próprio diretório /usr/ports — para encontrar os aplicativos que necessita e saber exatamente o nome do pacote a ser instalado.
Se souber o nome exato do pacote, pode usar o comando whereis, assim:

whereis mpg123 
mpg123: /usr/ports/audio/mpg123

Caso queira encontrar os nomes dos pacotes relacionados ao Apache 2.4, use um dos dois métodos abaixo:

pkg search apache24 
apache24-2.4.23_1              Version 2.4.x of Apache web server

ou (preferível):

make search name=apache24 

Certifique-se de estar sob o diretório /usr/ports, para executar este comando.

Port:   apache24-2.4.23_1
Path:   /usr/ports/www/apache24
Info:   Version 2.4.x of Apache web server
Maint:  apache@FreeBSD.org
B-deps: apr-1.5.2.1.5.4 autoconf-2.69_1 autoconf-wrapper-20131203 automake-1.15_
1 automake-wrapper-20131203 db5-5.3.28_4 expat-2.2.0 gdbm-1.12 gettext-runtime-0.19.8.1 indexinfo-0.2.4 libtool-2.4.6 libxml2-2.9.3 m4-1.4.17_1,1 pcre-8.39 perl 5-5.20.3_13
R-deps: apr-1.5.2.1.5.4 db5-5.3.28_4 expat-2.2.0 gdbm-1.12 gettext-runtime-0.19.8.1 indexinfo-0.2.4 libxml2-2.9.3 pcre-8.39 perl5-5.20.3_13
WWW:    http://httpd.apache.org/

Ao usar o ‘make search’ ou o ‘pkg search’, não é necessário saber o nome exato do pacote. Você pode fazer uma busca por parte do nome e usar o comando grep para filtrar os resultados:

make search name=libreoffice | grep -i portuguese
Path:   /usr/ports/portuguese/libreoffice
Path:   /usr/ports/portuguese/libreoffice-pt_BR

Use os parâmetros ‘search key’ para obter uma lista de pacotes relacionados ao que você deseja:

make search key=php7

Se a lista for muito grande, use o comando less, para pausar a exibição:

make search key=php7 | less 

Como instalar aplicativos no sistema

Entre no diretório do aplicativo e execute a instalação.
Veja um exemplo de como instalar o emulador dosbox no FreeBSD:

cd /usr/ports/emulators/dosbox
make install clean  
===> Building/installing dialog4ports as it is required for the config dialog
===>  Cleaning for dialog4ports-0.1.6
===> Skipping 'config' as NO_DIALOG is defined
===>  License BSD2CLAUSE accepted by the user
===>   dialog4ports-0.1.6 depends on file: /usr/local/sbin/pkg - found
=> dialog4ports-0.1.6.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch http://m1cro.me/dialog4ports/dialog4ports-0.1.6.tar.gz
===>  License GPLv2 accepted by the user
===>  Found saved configuration for dosbox-0.74_11
===>   dosbox-0.74_11 depends on file: /usr/local/sbin/pkg - found
=> dosbox-0.74.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch http://downloads.sourceforge.net/project/dosbox/dosbox/0.
74/dosbox-0.74.tar.gz

Para remover este mesmo pacote, futuramente, use o ‘deinstall’:

make deinstall all

Note que o comando deve ser executado dentro daquele mesmo diretório. Fique atento.