Gostaria de abrir uma discussão que acumularia as melhores práticas e dicas da linha de comando do Linux (CLI).
Eu procurei por essa discussão para compartilhar o comentário abaixo, mas não encontrei um, portanto, este post.
Espero que todos possamos aprender com isso.
Você pode compartilhar suas dicas do Bash, grep, sed, AWK, / proc e todas as outras administrações relacionadas ao sistema Linux / Unix, melhores práticas de programação de shell para o benefício de todos nós.
Respostas:
Use screen , um multiplexador de terminal gratuito desenvolvido pelo Projeto GNU que permitirá que você tenha vários terminais em um.
Você pode iniciar uma sessão e seus terminais serão salvos mesmo quando a conexão for perdida, para que você possa retomar mais tarde ou em casa.
fonte
SSH!
SSH é o comando divino - acho que é o comando geral mais valioso para aprender. As opções podem ser bastante assustadoras, mas parece que estou constantemente aprendendo a usar novas opções de linha de comando para SSH que nunca pensei que fossem necessárias. Eu posso ter usado todos eles neste momento.
Quanto mais você o usa, mais aprende. Você pode usá-lo para fazer algumas coisas INCRÍVEIS.
Nota: TODAS essas coisas são executáveis remotamente, sem configuração no servidor, exceto pelo fato de o servidor ssh estar em execução.
Montar um sistema de arquivos pela Internet
pesquise na rede por SSHFS
Comandos de encaminhamento .
O protocolo SVN + SSH é o Subversion de um cliente remoto para um servidor sem NO DEAMON em execução! O comando SVN inicia o servidor através do shell ssh e passa as informações para frente e para trás através do canal existente. O programa rsync faz a mesma coisa, é executado em um servidor sem rsync deamon iniciando um via SSH. É fácil escrever seus próprios arquivos bash para fazer truques semelhantes.
Cadeia para atravessar firewalls
Eu uso isso o tempo todo para passar pelo meu servidor linux em casa para o meu mac.
Portas de encaminhamento:
parece apenas moderadamente útil até você perceber que pode saltar através do firewall doméstico e configurar seu roteador em casa do trabalho como se estivesse fazendo isso de dentro da sua rede doméstica).
Encaminhar solicitações X:
Este é outro incrível. Com ou sem um servidor X em execução no seu sistema remoto, você pode executar um programa x-windows e a janela aparecerá na tela local. Basta usar o interruptor -X, isso é tudo!
Como você não precisa ter um servidor X em execução no servidor remoto, o impacto da CPU no servidor é mínimo, você pode ter um servidor TINY Linux que oferece aplicativos enormes para o seu poderoso PC de jogo executando Windows e cygwin / X.
É claro que o VI e o EMACS funcionam com SSH, mas quando estou em casa, às vezes quero mais. Eu uso o ssh -X para iniciar uma cópia do Eclipse! Se o seu servidor é mais poderoso que o seu laptop, você tem a GUI bem ali, mas as compilações são feitas no servidor, portanto, não se preocupe com a carga do sistema.
Executar em arquivos em lote
(ou seja, execute um arquivo em lote local que "faça coisas" em outros sistemas):
Duas coisas se combinam para deixar este legal. Uma é que você pode eliminar as solicitações de senha usando chaves de criptografia (mais seguras). A segunda é que você pode especificar um comando na CLI SSH. Eu usei isso de algumas maneiras interessantes - como quando uma compilação falha no servidor remoto, eu colocava o SSH no meu computador e reproduzia um arquivo de som).
Lembre-se de que você pode redirecionar a saída do comando remoto e usá-la no seu arquivo em lote local, para que você também possa executar localmente uma compilação em execução no servidor.
Incorporado ao Mac
O servidor e o cliente são incorporados no mac e no linux. No caso do Mac e do Ubuntu, ativar um servidor é tão simples quanto encontrar a caixa de seleção correta.
Em um PC, instale o cygwin ou cygwin / X (o cygwin / X permitirá que você encaminhe sua saída x-window da sua máquina Linux para o seu PC com Windows - ele instala um servidor X)
Dicas importantes / arquivo de configuração
Nunca use a porta 22 no seu firewall. Você terá várias tentativas de invasão, mas não vale a pena. Apenas faça com que o firewall encaminhe uma porta diferente para o servidor.
Existem amplas opções de configuração que permitem simplificar significativamente seus comandos ssh. Aqui está um exemplo meu no trabalho:
Quando digito "ssh home" (nada mais), ele age como se eu tivesse digitado:
e depois encaminha minha porta local 1025 para o meu sistema "mac" em casa. A razão para isso é que tenho outra entrada no meu arquivo:
para que, depois de criar uma "ssh home" e ainda ter a janela aberta, eu possa digitar "ssh mac" e o computador em funcionamento aqui tente conectar-se à sua própria porta 1025 que foi encaminhada para "mac: 22 "pelo outro comando, para que ele se conecte ao meu Mac em casa através do firewall.
Editar - script legal!
Desenterrei um script antigo que adoro - tive que voltar e publicá-lo para qualquer pessoa aqui que pudesse estar interessada. O script é chamado "authMe"
Se você possui esse script no diretório inicial e existe um host ao qual você pode se conectar (via ssh), digite "./authMe hostName".
Se necessário, ele criará um par de chaves público / privado para você, em seguida, transferirá o ssh para a outra máquina e copiará sua chave pública (o comando ssh solicitará uma senha ...)
Depois disso, o comando SSH não deve mais solicitar sua senha ao se conectar ao sistema remoto, ele usará o par de chaves pública / privada.
Se o seu computador remoto nem sempre estiver seguro, considere definir uma "senha" quando solicitado.
Você também pode configurar o servidor ssh na extremidade oposta para não permitir senhas de texto (apenas chaves) para segurança adicional.
fonte
ssh-copy-id
e é tão simples quantossh-copy-id user@someserver
Eu gosto de usar
para mudar para o diretório anterior. Muito útil!
fonte
Descobri recentemente o
pv
comando (visualizador de tubos) que é como gato, mas com detalhes de transferência.Então, ao invés de
Você pode usar
Então, em vez de não fazer idéia de quando sua operação será concluída, agora você saberá!
Cortesia de Peteris Krumins
fonte
tee(1)
.Execute novamente o comando anterior como root.
[O comando superior atual no site http://www.commandlinefu.com , um site com o tema desta pergunta.]
fonte
Pressione Ctrl-R e comece a digitar um comando (ou qualquer parte dele) - ele pesquisa o histórico de comandos. Pressionar Ctrl-R novamente pulará para a próxima partida, enter executa o comando atualmente exibido e a seta para a direita (pelo menos) permitirá que você o edite primeiro.
Eu tinha usado o Linux por algo como 7 anos como meu sistema operacional principal antes de aprender isso, mas agora que eu o conheço, é bastante útil.
fonte
stty -ixon
primeiro desativar o significado de controle de fluxo XON / XOFF (isso também disponibiliza Ctrl-Q, por padrão, ele é mapeado para ser o mesmo que inserção com aspas Ctrl-V, mas você pode alterá-lo para outra coisa ) Vejaman stty
eman readline
para mais informações. Ostty
comando pode ser adicionado ao seu~/.bashrc
A linha de comando é uma coisa engraçada. Eu acho que você só pode aprender muito sozinho e o resto, por acidente, assistindo alguém usando uma linha de comando.
Eu estava usando o shell há anos digitando meticulosamente os nomes dos diretórios manualmente. Um dia, eu estava assistindo um amigo mexer no sistema e ele continuou pressionando a tecla Tab. Eu perguntei "por que você está acessando a guia?". Resposta: tenta completar o diretório ou o nome do arquivo. Quem teria adivinhado - conclusão da guia! Digite um pouco do arquivo ou diretório, pressione a tecla Tab e ele tentará finalizar o que você digitou (o comportamento depende de qual shell).
Um dia, esse amigo estava me observando na linha de comando e me viu digitar algo como:
Quem teria adivinhado !? Ele nunca soube sobre
popd
/pushd
. Acho que estamos quites ...fonte
Aprenda o Vim.
É (sem dúvida) o melhor editor, mas certamente o melhor editor disponível em um servidor Linux.
fonte
Às vezes, é útil deixar um programa em execução mesmo após o logout. Eu já vi algumas soluções que usam nohup ou até tela para esse fim. O mais simples que conheço é:
Você também pode desanexar um programa em execução:
fonte
Quando quero ter certeza de que uso o comando real e não um alias, uso uma barra invertida à esquerda:
fonte
builtin
".Esta dica deixará sua CLI mais confortável (pelo menos para mim):
crie o arquivo ~ / .inputrc com o seguinte conteúdo:
Recarregue o bash (por exemplo, digitando "exec bash"). Quando você digita o prefixo de um comando e pressiona a seta para cima, você navega pelos comandos que começam com o seu prefixo; por exemplo, se você digitou ssh, ele mostra suas conexões anteriores com shells remotos. Se o seu prompt estiver vazio, a seta para cima navegará no histórico da maneira normal.
fonte
exec bash
man readline
e memorizá-lo de atalhos padrãobind -f ~/.inputrc
recarregar o inputrc sem precisar iniciar um novo bash e acabar com o seu ambiente atual.Use em
&&
vez de;
executar vários comandos ao mesmo tempo. Para quando ocorre um erro e não executa os outros comandos.Exemplo clássico:
fonte
dosomething && echo "success" || echo "teh fail"
Ao escrever loops na linha de comando no bash, prefixo comandos arriscados com o comando 'eco'.
Dessa forma, eu consigo ver o 'algo arriscado' na íntegra antes de me comprometer a executá-lo. Ajuda quando seu comando arriscado inclui expansões e globs variáveis. E 'set -x' é muito útil ao escrever scripts bash.
'set -x' permite a depuração. Consulte http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html para obter informações sobre a depuração do bash.
fonte
Requerimento
Você precisa testar a largura de banda máxima entre 2 servidores.
Solução
No SERVER1, faça:
No SERVER2, faça:
Você verá resultados como:
117 MB / s é o fator interessante aqui, que mostra a largura de banda real de transferência de rede.
Explicação :
Como o pacote começará a fluir pela rede, você poderá ver as estatísticas de largura de banda no SERVER2, que é uma estimativa muito boa da largura de banda máxima possível real entre os 2 servidores.
Cópia por UDP (para evitar sobrecarga de TCP).
Copiar da memória (/ dev / zero) no SERVER1 para a memória (/ dev / null) no SERVER2, impedindo, assim, a E / S do disco de se tornar um gargalo.
fonte
Ver estruturas de diretório de cores é mais fácil.
Editar
fonte
Alguns pequenos ponteiros sobre a visualização de logs:
fonte
tail -f
você pode assistir vários registros de uma só vez! Exemplo:tail -f log1.txt -f log2.txt
Há muito tempo, aprendi um truque com um amigo para alterar facilmente a extensão de um arquivo:
A expansão da Shell expandirá isso para:
Isso também pode ser usado para renomear um arquivo de outras maneiras, como adicionar algo em:
fonte
ls -l /bin/c
e pressionar Alt-Shift- {e isso fará com que seja parecidols -l /bin/c{at,h{grp,mod,own,vt},p{,io},sh}
com você.Use "tar xf" para extrair arquivos compactados. O j para bzip2 ez para o gzip não são necessários, pois o tar detectará o tipo de arquivo do seu arquivo. Nem é sinal '-' antes dos argumentos. Você economizará muito tempo (mais de um milênio ;-)).
Melhor ainda, use unfoo para extrair qualquer arquivo morto com um único comando, sem argumentos desnecessários.
fonte
alias ut="tar xf"
- torna a extração de arquivos ainda mais fácil.Instale o pacote de conclusão do bash. Ele contém várias regras de conclusão predefinidas para o shell. Habilite-o digitando "source / etc / bash_completion" se a sua distribuição não o fizer. Por exemplo, sempre que você concluir o kpdf, verá apenas uma lista de diretórios e arquivos PDF. É tão inteligente quanto concluir arquivos remotos após scp ssh: // server / XXX (se você ativou logins sem senha).
fonte
Eu uso constantemente esses
ALT-. (ESC +. Em alguns terminais) copia o último argumento usado (super útil)
CTRL-W exclui a palavra
Terminal CTRL-L clear (como comando clear, mas mais rápido)
ALT-B (ESC + B em alguns terminais) retrocede uma palavra
ALT-F (ESC + F em alguns terminais) avança uma palavra
CTRL-E pula para EOL
CTRL-A salta para BOL
Pesquisa CTRL-R no histórico
fonte
No bash, eu uso muito ! $ . Ele repete o último argumento do último comando:
Ele executará o ls; se você quiser editá-lo, não precisará digitá-lo novamente, basta usar! $. Isso é realmente útil para nomes longos de caminho / arquivo. Além disso ,! * Repete todos os argumentos do comando anterior. Eu não uso muito isso, mas parece útil.
Eu sabia que eles foram mencionados, mas eu uso vim, screen e cd - muito.
Eu esqueci noclobber:
De man bash :
fonte
Alt-.
.Alterne do bash para o zsh e veja sua produtividade melhorar:
O Google fornecerá muitos outros benefícios.
fonte
Old school, movendo uma árvore de diretórios de um lugar para outro, preservando links simbólicos, permissões e todas as coisas boas:
ou através da rede
Nova escola:
ou através da rede
fonte
tar xvBpf - -C /destination
==(cd /destination; tar xvBpf -)
Um pouco menos de digitação e mais fácil de usar sobre ssh.rsync -avh
é melhor em uma única máquina -h
garante que os links físicos sejam transferidos corretamente sem transformar cada link em um arquivo separado, embora, se você tiver um número enorme de arquivos, ele possa usar muita memória.rsync -avzh . foo.com/destination
é o equivalente para a rede e, geralmente, você não precisa do-e ssh
como o rsync saberá usar ssh.rsync -aSHuvrx --delete / --link-dest=/backup/$PREV /backup/$HOUR
Requisito : você tem um diretório que contém uma grande lista de arquivos que você deseja excluir. rm -r falhará!
exemplo
Solução :
Explicação :
Edit: Fixing explanation following @ephemient comment.
find fornecerá argumentos para rm pelos argumentos máximos permitidos. Isso permitirá que a rm exclua arquivos em lotes, que é a técnica mais rápida que eu conheço sem usar a operação -delete de encontrar a si mesma. É equivalente a
que você pode achar útil se o seu
find
não suportar-exec ... +
.fonte
\;
por+
: entãofind
fará o quexargs
faz por padrão, que é agrupar os argumentos o máximo possível (sem ultrapassar o limite da lista de argumentos). Ou simplesmente usar-delete
intead de-exec rm
(GNU Findutils necessários para ambos)find ... -delete
, se a sua descoberta for tão dotada.Eu uso essas duas dicas com tanta frequência que achei que seria uma boa idéia compartilhar:
Inicia o último comando no arquivo de histórico que começa com "foo" (geralmente o uso na compilação,
!gcc
por exemplo).O outro é um atalho de teclado (Ctrl + O em vez de Return); este executará o comando E exibirá o próximo comando no arquivo de histórico. Por exemplo, quando eu compilar e testar um arquivo, eu sempre executo 3 ou 4 comandos, faço cd para o diretório do teste, execute o teste, cd para o diretório do makefile. O uso de Ctrl + O torna essa tarefa muito mais fácil :)
Espero que esta ajuda!
fonte
Como usar o subversion no Linux sem a ajuda de interfaces gráficas sofisticadas que podem não estar disponíveis.
Isso impede muitos desenvolvedores de usar o Linux, por incrível que pareça.
fonte
O comando mais negligenciado da velha escola:
find
Ontem eu consertei um bug de permissões brutas:
fonte
chmod 644 $(find . -type f)
,chmod 755 $(find . -type d)
-perm
opção defind
localizar arquivos com permissões definidas de uma certa maneira.Para shells como
bash
eksh
, você pode fazer a linha de comando responder aos comandos de navegação como seu editor de texto:ou
permitirá que você pesquise seu histórico e mova-se pela linha de comando da maneira que você está acostumado a fazer em arquivos de texto (por exemplo, no modo vi, pressionar
ESC
e digitar/string
pesquisará "string" nos comandos anteriores - você pode usarn
eN
mover entre correspondências)fonte
grep é meu amigo. A sério.
Listar
.rb
arquivos que contêm o textoclass foo
:Listar
.rb
arquivos que não contêm o textoclass foo
:Liste os
.rb
arquivos que não contêm foo ou bar (você pode usar qualquer regexp com -e, mas precisa escapar dos operadores):fonte
A substituição do shell é realizada com
^
:fonte