$ perl -wle 'my @388=0..2;'
Can't use global @388 in "my" at -e line 1, near "my @388"
Execution of -e aborted due to compilation errors.
$ perl -wle '@388=0..2;'
$
Onde posso aprender mais sobre o misterioso @0 ... @9999 do Perl, etc.?
$ perl -wle 'my @388=0..2;'
Can't use global @388 in "my" at -e line 1, near "my @388"
Execution of -e aborted due to compilation errors.
$ perl -wle '@388=0..2;'
$
Onde posso aprender mais sobre o misterioso @0 ... @9999 do Perl, etc.?
Estou tentando me conectar a uma VPN Cisco AnyConnect do meu cliente Fedora 40. Eu tentei tanto a GUI (muitos tutoriais por aí) quanto o terminal para estabelecer essa conexão através do OpenConnect e falhei com:
SSL connection failure: A packet with illegal or unsupported version was received.
Failed to open HTTPS connection to vpn.vpn.vpn
Esta é uma tentativa de conexão real:
$ openconnect vpn.vpn.vpn
POST https://vpn.vpn.vpn/
Connected to 0.0.0.0:443
SSL negotiation with vpn.vpn.vpn
SSL connection failure: A packet with illegal or unsupported version was received.
Failed to open HTTPS connection to vpn.vpn.vpn
Failed to complete authentication
Basicamente, quero fazer login no meu sistema e deixar que o sistema abra para mim meu navegador da Web (Thorium). Como estou usando o Ubuntu 22.04 e quero iniciar o navegador como usuário (e não como root ), segui esta instrução cuidadosamente (usando a opção --user e colocando meu script .service na pasta systemd/user ).
Então agora tenho esta configuração:
ubuntu@B1:/etc/systemd/user$ cat thorium.service
[Unit]
Description=Thorium Web Browser
[Service]
#User=myuser
#Group=mypass
ExecStart=/opt/scripts/thorium_start.sh
[Install]
WantedBy=default.target
onde o AppImage do Thorium é iniciado a partir deste script:
ubuntu@B1:/etc/systemd/user$ cat /opt/scripts/thorium_start.sh
#!/bin/bash
filename="/opt/thorium/Thorium.AppImage"
logfile="/tmp/log.txt"
echo "Starting Thorium" > ${logfile}
echo date >> ${logfile}
sleep 30 # <= Added because I though that probably a delay makes sense
if [[ -f "$filename" ]]; then
$filename;
else
echo "$filename not found";
fi
e a propósito:
ubuntu@B1:/etc/systemd/user$ systemctl --user is-enabled thorium.service
enabled
e
ubuntu@B1:/etc/systemd/user$ ls -l
insgesamt 24
drwxr-xr-x 2 root root 4096 Aug 9 2022 ayatana-indicators.target.wants
drwxr-xr-x 2 root root 4096 Aug 9 2022 default.target.wants
drwxr-xr-x 2 root root 4096 Aug 9 2022 graphical-session-pre.target.wants
drwxr-xr-x 2 root root 4096 Aug 9 2022 pipewire.service.wants
lrwxrwxrwx 1 root root 52 Nov 28 2022 pipewire-session-manager.service -> /usr/lib/systemd/user/pipewire-media-session.service
drwxr-xr-x 2 root root 4096 Jul 21 2023 sockets.target.wants
-rwxr-xr-x 1 root root 152 Jul 11 23:15 thorium.service
portanto, o arquivo .service foi configurado corretamente para iniciar na inicialização e tem direitos de execução.
Mas o problema é que após o login nenhum navegador inicia.
Fazendo do terminal algo simples:
$./thorium_start.sh
inicia o navegador como esperado, então não acho que o problema seja o script.
Alguma ajuda?
Meu sistema é:
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.4 LTS"
PRETTY_NAME="Ubuntu 22.04.4 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.4 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
Quando eu faço SSH em minha máquina kali do Fedora e tento executar um comando e pressiono TAB
para preenchê-lo automaticamente como abaixo ...
Então, no momento em que pressiono, TAB
faz o seguinte:
Observe isso primeiro sudo
? De alguma forma, ele simplesmente aparece e não passa de pixels na tela e não faz parte do comando se eu pressionar Enter. Então, se eu backspace
pressionar Enter completamente, o Sudo ainda permanecerá na tela, mas não haverá caixa de sudo
comando de ajuda se ele for realmente executado ao pressionar Enter.
Eu só poderia testar isso fazendo o mesmo na VM real e não existe esse problema. Alguma ideia do que está acontecendo aqui?
E se for importante, tive que gerar e alterar UUIDS para esta VM e adicionar chaves MOK, já que copiei descaradamente a pasta da VM ao alterar as distros em vez de cloná-la. E no meu sistema operacional Ubuntu anterior, esse problema não estava acontecendo.
Variáveis:
$TERM
está xterm-256color
em ambosUTF-8
em ambos$PS1
na VM:
┌──(kali㉿kali-pc)-[~]
└─$ echo "$PS1"
%F{%(#.blue.green)}┌──${debian_chroot:+($debian_chroot)─}${VIRTUAL_ENV:+($(basename $VIRTUAL_ENV))─}(%B%F{%(#.red.blue)}%n㉿%m%b%F{%(#.blue.green)})-[%B%F{reset}%(6~.%-1~/…/%4~.%5~)%b%F{%(#.blue.green)}]
└─%B%(#.%F{red}#.%F{blue}$)%b%F{reset}
Editar: solução de problemas adicionais para descobrir "quando" isso acontece e "o que" faz
TAB
e não right-arrow
para completar a partir da última sugestão utilizada.ctrl+D
(de 1 caractere até completar o comando digitado no console)$
prompt, como visto abaixo
Digitei network
antes de pressionar TAB
e novamente, apenas os 4 primeiros foram afetados
Usando cd
um comando pequeno e pressionado TAB
e novamente os primeiros 4 caracteres ficaram confusos.
Editar 2: Simplesmente configurar PS1='$ '
'resolve' isso, mas isso não explica o que está acontecendo aqui.
Configurando um novo servidor Debian 12 totalmente remotamente (não tenho acesso físico à máquina).
Eu gostaria de ter certeza extra de que não vou errar. Gostaria de ativar o ufw, mas manter o serviço desativado. Para que caso eu estrague, eu possa reiniciar e o sistema será reiniciado com o ufw desligado novamente.
Eu pesquisei e tudo o que o Google encontrou foram pessoas solucionando por que ele NÃO liga na reinicialização.
Gêmeos diz systemctl start ufw
, mas isso sai imediatamente:
root@server:/etc# journalctl -u ufw
Jul 24 13:19:23 server systemd[1]: Starting ufw.service - Uncomplicated firewall...
Jul 24 13:19:23 server systemd[1]: Finished ufw.service - Uncomplicated firewall.
root@server:/etc# ufw version
ufw 0.36.2
Copyright 2008-2023 Canonical Ltd.
root@server:/etc# systemctl status ufw
● ufw.service - Uncomplicated firewall
Loaded: loaded (/lib/systemd/system/ufw.service; enabled; preset: enabled)
Active: active (exited) since Wed 2024-07-24 13:19:23 UTC; 1min 34s ago
Docs: man:ufw(8)
Process: 1054133 ExecStart=/lib/ufw/ufw-init start quiet (code=exited, status=0/SUCCESS)
Main PID: 1054133 (code=exited, status=0/SUCCESS)
CPU: 1ms
O Debian fundiu recentemente /bin e /usr/bin , ou seja, /bin agora é um link simbólico para /usr/bin. No entanto, o PATH padrão definido em /etc/login.defs ainda contém os dois diretórios:
ENV_SUPATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ENV_PATH PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
Isso leva a duplicatas quando todos os diretórios em PATH são pesquisados. Por exemplo:
$ type -a ls
ls is /usr/bin/ls
ls is /bin/ls
$ ( IFS=:; grep -rlI '^#! */bin/sh' $PATH ) | grep apt-
/usr/bin/apt-key
/bin/apt-key
Portanto, seria bom remover /bin e /sbin do PATH, mas como isso não foi feito, presumo que haja algumas razões, talvez sutis, para isso. Então, quais seriam as consequências de remover esses diretórios do PATH?
Desejo fazer ping em meu roteador em processo em segundo plano. Também quero controlar o processo de ping como um serviço: iniciar, status, parar. Então, eu crio um arquivo de bloqueio e armazeno o PID nele. Mas na verdade o PID está mudando e não posso encerrar meu processo. Eu armazeno o PID com a variável $$, mas está mudando, não sei por que, pode ser porque executo o pipe ou posso estar executando o processo em segundo plano? Você poderia me aconselhar como obter o PID no script sh, onde executo o pipe em segundo plano?
Código do meu script sh ping.sh:$ cat ping.sh
#!/bin/sh
option=$1
if [ "$option" = "start" ]; then
if [ -f /tmp/ping.lock ]; then
echo There is another ping process. Exit
exit 1
else
touch /tmp/ping.lock
(ping 192.168.1.1 | ts | tee -a >> ~/1) &
echo $$ > /tmp/ping.lock ##here i store script pid
fi
elif [ "$option" = "status" ]; then
if [ -f /tmp/ping.lock ]; then
echo ping is running. PID:
cat /tmp/ping.lock
else
echo ping is not running
fi
elif [ "$option" = "stop" ]; then
if [ -f /tmp/ping.lock ]; then
echo killing ping process
kill $(cat /tmp/ping.lock)
echo removing lock file
rm /tmp/ping.lock
echo ping stopped.
else
echo ping is not running.
fi
else
echo Usage: $0 [start, status, stop]
fi
Na verdade, a linha echo $$ > /tmp/ping.lock ##here i store script pid
não armazena o PID real, mas o pid armazenado desaparece. E esta chamada não mata meu script:
$ ./ping.sh
Usage: ./ping.sh [start, status, stop]
$ ./ping.sh start
There is another ping process. Exit
$ rm /tmp/ping.lock
$
$ ./ping.sh start
$ ps -ef | grep ping
y 5271 2221 1 19:36 ? 00:00:10 /usr/lib/chromium/chromium --show-component-extension-options --enable-gpu-rasterization --no-default-browser-check --disable-pings --media-router=0 --enable-remote-extensions --load-extension
y 5993 4075 0 19:44 pts/2 00:00:00 vim ping.sh
y 6089 1 0 19:45 pts/5 00:00:00 /bin/sh ./ping.sh start
y 6090 6089 0 19:45 pts/5 00:00:00 ping 192.168.1.1
y 6095 5241 0 19:45 pts/5 00:00:00 grep ping
$
$ cat /tmp/ping.lock
6087
$
$ ./ping.sh stop
killing ping process
./ping.sh: 27: kill: No such process
removing lock file
ping stopped.
$
$ ps -ef | grep ping
y 5271 2221 1 19:36 ? 00:00:10 /usr/lib/chromium/chromium --show-component-extension-options --enable-gpu-rasterization --no-default-browser-check --disable-pings --media-router=0 --enable-remote-extensions --load-extension
y 5993 4075 0 19:44 pts/2 00:00:00 vim ping.sh
y 6089 1 0 19:45 pts/5 00:00:00 /bin/sh ./ping.sh start
y 6090 6089 0 19:45 pts/5 00:00:00 ping 192.168.1.1
y 6148 5241 0 19:46 pts/5 00:00:00 grep ping
Como você pode ver, após a chamada ./ping.sh stop
ainda há processo do meu script e seu PID é 6089, enquanto no arquivo de bloqueio está armazenado o PID 6087. Como obter o PID 6089 armazenado no arquivo de bloqueio? Quando e como armazená-lo?
Premissa
Eu li o que está listado na bibliografia sobre cd
, pwd
, set -P
.
Por padrão, ou quando a
-L
opção é fornecida, os links simbólicos no diretório são resolvidos apóscd
processar uma instância de '..
' no diretório. (ref. Manual de referência do Bash - seção " 4 comandos integrados do Shell" -cd
parágrafo )
Se '
..
' aparecer em directory , ele será processado removendo o componente do nome do caminho imediatamente anterior, de volta a uma barra ou ao início de directory . (ibid.)
Minha versão do Bash é
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
Problema
Para testar as coisas, tenho o seguinte esquema de arquivos em meu diretório de trabalho atual que é a raiz do meu experimento ( dir111
é um link simbólico para dir010
).
dir010/
dir020/
dir110/dir111 -> ../dir010
my_dir="$PWD"
cd dir110/dir111 # 1
cd .. # 2
cd dir111 # 3
cd ../dir020 # 4
cd "$my_dir" # 5
cd dir110/dir111/../dir020 # 6
cd - # 7
cd dir110/dir111/../../dir020 # 8
"$my_dir"/dir110/dir111
, conforme esperado[^1]."$my_dir"/dir110
, conforme esperado[^1]."$my_dir"/dir020
como inesperado . Eu esperaria cd
falhar em "$my_dir"/dir110/dir020
(veja a explicação abaixo)."$my_dir"/dir020
, conforme esperado[^1], mas em contraste com 6.A linha 4 deve falhar pelo motivo do parágrafo seguinte.
O manual de referência e a página de manual (veja a citação na Premissa) dizem que ..
make cd
apenas remove o componente do nome do caminho anterior, em vez de olhar para a ..
entrada do inode. Portanto, o diretório pai "$my_dir/dir110/dir111
visto por cd
(no comportamento padrão) é "$my_dir/dir110
, que não contém dir020
.
Achei que esse comportamento poderia ser uma exceção causada por ..
ser o prefixo do «dirname»
fornecido to cd «dirname»
. No entanto, usar ..
como infixo (linha 6) contrasta com isso.
cd
está se comportando como se cd -P
tivesse sido executado (ou set -P
comando (ou similar) emitido antes), ou seja, não seguindo links simbólicos. Com cd -P
, em 1., o diretório de trabalho atual seria definido como $my_dir/dir010
.
set -o
diga-me
[omissis]
physical off
pipefail off
posix off
[omissis]
A minha interpretação (e de outras pessoas como eu em outras perguntas postadas) do manual de referência está correta? o que estou perdendo? Como o comportamento de pode cd
ser descrito?
[^1]: O comportamento padrão cd
é seguir links simbólicos
Bibliografia
No sistema Busybox que estou usando, a saída busybox ifconfig -a
inclui um campo para "Endereço base":
~ # busybox ifconfig -a
eth0 Link encap:Ethernet HWaddr 00:D0:93:4D:AE:4F
inet addr:192.168.9.159 Bcast:192.168.9.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1 errors:0 dropped:0 overruns:0 frame:0
TX packets:140 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:60 (60.0 B) TX bytes:7136 (6.9 KiB)
Base address:0xd000
eth1 Link encap:Ethernet HWaddr 00:D0:93:4D:AE:50
inet addr:192.168.9.160 Bcast:192.168.9.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:20 errors:0 dropped:0 overruns:0 frame:0
TX packets:21 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1826 (1.7 KiB) TX bytes:1678 (1.6 KiB)
Base address:0x1000
eth2 Link encap:Ethernet HWaddr 00:D0:93:4D:AE:51
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Base address:0xd000
Não consegui encontrar nenhuma informação sobre o que isso representa, apesar da extensa pesquisa. Alguém pode me dizer o que é, já que é claramente considerado importante e relevante o suficiente para ser incluído na ifconfig
produção?
Estou usando a biblioteca libwebsockets para implementação de servidor https. Aqui está o código para servir um arquivo via HTTPS, mas recebo resposta HTTPS sem variável de cabeçalho
Content-Disposition:attachment; filename=logs.zip
e recebeu o conteúdo do arquivo no corpo da resposta!
Estou faltando alguma coisa aqui? Espero que a adição Content-Disposition
permita que o cliente do navegador baixe o arquivo.
Aqui está minha montaria:
struct lws_http_mount mount = {
/* .mount_next */ NULL, /* linked-list "next" */
/* .mountpoint */ "/", /* mountpoint URL */
/* .origin */ "var/www/", /* serve from dir */
/* .def */ NULL, /* default filename */
/* .protocol */ NULL,
/* .cgienv */ NULL,
/* .extra_mimetypes */ "application/zip", //NULL,
/* .interpret */ NULL,
/* .cgi_timeout */ 0,
/* .cache_max_age */ 0,
/* .auth_mask */ 0,
/* .cache_reusable */ 0,
/* .cache_revalidate */ 0,
/* .cache_intermediaries */ 0,
/* .origin_protocol */ LWSMPRO_FILE, /* files in a dir */
/* .mountpoint_len */ 1, /* char count */
/* .basic_auth_login_file */ NULL,
};
if (lws_serve_http_file(wsi, "/tmp/log.zip", "application/zip", NULL, 0) < 0) {
lwsl_err("Failed to serve file: %s\n", "/tmp/log.zp");
lws_return_http_status(wsi, HTTP_STATUS_INTERNAL_SERVER_ERROR, NULL);
return ;
}
E aqui estão os cabeçalhos de resposta
Obrigado pelo apoio