Recentemente, configurei os sistemas Fedora 28 e Ubuntu 18.04 e gostaria de configurar minha conta de usuário principal em ambos para que eu possa executar sudo
comandos sem ser solicitada uma senha.
Como posso fazer isso nos respectivos sistemas?
Dado este exemplo mínimo
( echo "LINE 1" ; sleep 1 ; echo "LINE 2" ; )
ele gera LINE 1
e, em seguida, após um segundo, gera LINE 2
, conforme o esperado .
Se canalizarmos isso paragrep LINE
( echo "LINE 1" ; sleep 1 ; echo "LINE 2" ; ) | grep LINE
o comportamento é o mesmo do caso anterior, conforme esperado .
Se, alternativamente, canalizarmos isso paracat
( echo "LINE 1" ; sleep 1 ; echo "LINE 2" ; ) | cat
o comportamento é novamente o mesmo, como esperado .
No entanto , se canalizarmos para grep LINE
, e depois para cat
,
( echo "LINE 1" ; sleep 1 ; echo "LINE 2" ; ) | grep LINE | cat
não há saída até que um segundo passe, e ambas as linhas aparecem na saída imediatamente, o que eu não esperava .
Por que isso está acontecendo e como posso fazer a última versão se comportar da mesma maneira que os três primeiros comandos?
Eu me deparei com um script Bash hoje que tem nomes de funções com dois-pontos duplos ::
neles, por exemplo, file::write()
e file::read()
. Eu nunca vi essa sintaxe antes em um script Bash e, quando invoquei o script, ele funcionou bem (para minha surpresa).
Depois de vasculhar a página man do Bash no meu sistema (e online), não consigo encontrar nada na documentação que suporte essa sintaxe para nomes de funções. Por exemplo, a seção Shell Defined Functions
define a sintaxe para uma função shell ser
function name [()] compound-command [redirection]
e então (em outra parte do manual) o token name
é definido como
name A word consisting only of alphanumeric characters and
underscores, and beginning with an alphabetic character
or an underscore. Also referred to as an identifier.
Não há menção em nenhum lugar da sintaxe de dois pontos para nomes de funções.
A única outra referência a essa sintaxe de dois pontos que encontrei até agora está neste Shell Style Guide (consulte a subseção Naming Conventions > Function Names
) que recomenda o uso da sintaxe de dois pontos para nomes de funções em "pacotes" -- por exemplo, mypackage::myfunction()
.
Essa sintaxe de dois pontos para nomes de funções é um recurso legítimo do shell Bash ou talvez seja um recurso não documentado? Se for legítimo, onde está documentado no manual do Bash? Procurei e procurei, mas não encontro nada sobre isso no manual. O mais próximo que encontrei é o uso de ::
na PATH
variável de ambiente para adicionar o diretório de trabalho atual ao caminho de pesquisa.
EXEMPLO
#!/bin/bash
function abc::def() {
echo "${FUNCNAME[0]}"
}
abc::def
Eu testei este script em três distribuições Linux diferentes e em todas as três o script imprime abc::def
em stdout.
Depois de ler sobre os namespaces do Linux, fiquei com a impressão de que eles são, entre muitos outros recursos, uma alternativa ao chroot. Por exemplo, neste artigo :
Outros usos [de namespaces] incluem [...] o isolamento no estilo chroot() de um processo para uma parte da hierarquia de diretório único.
No entanto, quando clono o namespace mount, por exemplo, com o comando a seguir, ainda vejo toda a árvore raiz original.
unshare --mount -- /bin/bash
Entendo que agora posso executar montagens adicionais no novo namespace que não são compartilhados com o namespace original e, portanto, isso fornece isolamento, mas ainda é a mesma raiz, por exemplo, /etc
ainda é o mesmo para ambos os namespaces. Ainda preciso chroot
alterar a raiz ou existe uma alternativa?
Eu esperava que essa pergunta fornecesse uma resposta, mas a resposta usa apenas chroot
, novamente.
Havia um comentário agora excluído que mencionava pivot_root
. Como isso é realmente parte de linux/fs/namespace.c
, na verdade é parte da implementação de namespaces. Isso sugere que alterar o diretório raiz apenas com unshare
e mount
não é possível, mas os namespaces fornecem uma versão própria - mais inteligente - do chroot
. Ainda não entendi a ideia principal dessa abordagem que a torna fundamentalmente diferente de chroot
, mesmo depois de ler o código-fonte (no sentido de, por exemplo, segurança ou melhor isolamento).
Esta não é uma duplicata desta pergunta . Depois de executar todos os comandos da resposta, tenho separado /tmp/tmp.vyM9IwnKuY (ou similar), mas o diretório raiz ainda é o mesmo!
A partir deste post é mostrado que FS:[0x28]
é um stack-canary. Estou gerando esse mesmo código usando o GCC nesta função,
void foo () {
char a[500] = {};
printf("%s", a);
}
Especificamente, estou recebendo esta montagem ..
0x000006b5 64488b042528. mov rax, qword fs:[0x28] ; [0x28:8]=0x1978 ; '(' ; "x\x19"
0x000006be 488945f8 mov qword [local_8h], rax
...stuff...
0x00000700 488b45f8 mov rax, qword [local_8h]
0x00000704 644833042528. xor rax, qword fs:[0x28]
0x0000070d 7405 je 0x714
0x0000070f e85cfeffff call sym.imp.__stack_chk_fail ; void __stack_chk_fail(void)
; CODE XREF from 0x0000070d (sym.foo)
0x00000714 c9 leave
0x00000715 c3 ret
O que está configurando o valor de fs:[0x28]
? O kernel, ou o GCC está lançando o código? Você pode mostrar o código no kernel ou compilado no binário que define fs:[0x28]
? O canário é regenerado - na inicialização ou no processo de geração? Onde isso está documentado?
Um pequeno servidor IoT retorna um arquivo, cujo nome é dado pela data e hora atuais, para torná-lo único. O formato é 2018.07.04.18.22.45.dat
.
Solicitando endereço XX.XX.XX.XX:5001/read
em um navegador (com o cache do navegador desabilitado), o arquivo é retornado com seu nome original.
Usando wget, infelizmente, não consigo preservar o nome do arquivo:
wget XX.XX.XX.XX:5001/read
retorna o conteúdo adequado, mas com name read
, read.1
, read.2
, etc.
Existe a possibilidade de coletá-lo mantendo o nome, usando wget
ou outros comandos?
ADDENDUM : usando curl XX.XX.XX.XX:5001/read
eu obtenho o conteúdo bruto em vez do arquivo.
ADDENDUM : como uma solução imperfeita, posso gerar um nome de arquivo com base no timestamp com wget -o $(date "+%Y.%m.%d-%H.%M.%S.%N.dat") XX.XX.XX.XX:5001/read
. Claro que não corresponde ao nome do arquivo original.
entrada json:
[
{
"name": "cust1",
"grp": [
{
"id": "46",
"name": "BA2"
},
{
"id": "36",
"name": "GA1"
},
{
"id": "47",
"name": "NA1"
},
{
"id": "37",
"name": "TR3"
},
{
"id": "38",
"name": "TS1"
}
]
}
]
esperado, na saída são duas linhas:
name: cust1
groups: BA2 GA1 NA1 TR3 TS1
Eu estava tentando construir filtro sem sucesso..
$ jq -r '.[]|"name:", .name, "groups:", (.grp[]|[.name]|@tsv)' test_json
name:
cust1
groups:
BA2
GA1
NA1
TR3
TS1
Atualização: a solução fornecida abaixo funciona bem, mas não previ o caso quando não existe nenhum grupo:
[
{
"name": "cust1",
"grp": null
}
]
nesse caso, a solução fornecida retorna erro:
$ jq -jr '.[]|"name:", " ",.name, "\n","groups:", (.grp[]|" ",.name),"\n"' test_json2
name: cust1
jq: error (at test_json2:6): Cannot iterate over null (null)
qualquer solução é apreciada.
A ferramenta de linha de comando oficial Checkpoint out da CheckPoint, para configurar uma VPN SSL Network Extender não está mais funcionando na linha de comando do Linux. Também não é mais suportado ativamente pelo CheckPoint.
No entanto, existe um projeto promissor, que tenta replicar o applet Java para autenticação, que conversa com o snx
utilitário de linha de comando, chamado snxconnect
.
Eu estava tentando colocar o snxconnect
utilitário de texto para funcionar no Debian Buster, fazendo:
sudo pip install snxvpn
e
export PYTHONHTTPSVERIFY=0
snxconnect -H checkpoint.hostname -U USER
No entanto, estava morrendo principalmente com um erro HTTP de:
HTTP/1.1 301 Moved Permanently:
ou:
Got HTTP response: HTTP/1.1 302 Found
ou:
Unexpected response, try again.
O que fazer sobre isso?
PS. O cliente oficial do EndPoint Security VPN está funcionando bem no Mac High Sierra e no Windows 10 Pro.
Estou usando o CentOS 7. Quero obter o PID (se houver) do processo em execução na porta 3000. Gostaria de obter esse PID para salvá-lo em uma variável em um script de shell. Até agora eu tenho
[rails@server proddir]$ sudo ss -lptn 'sport = :3000'
State Recv-Q Send-Q Local Address:Port Peer Address:Port
Cannot open netlink socket: Protocol not supported
LISTEN 0 0 *:3000 *:* users:(("ruby",pid=4861,fd=7),("ruby",pid=4857,fd=7),("ruby",pid=4855,fd=7),("ruby",pid=4851,fd=7),("ruby",pid=4843,fd=7))
mas não consigo descobrir como isolar o PID sozinho sem todas essas informações extras.