Criando uma variável permanente

1

É possível definir "variável permanente" no shell? Por exemplo, quando eu log in eu quero imprimir a mensagem "Olá usuário, este é o seu xxx log in"

O número de logins seria armazenado na variável permanente, e cada vez que fosse incrementado pelo script, por exemplo

#!/bin/bash
echo "Hello Mr. This is your $number log in"
$number=$(($number+1))

O próximo login seria imprimir a variável incrementada e incrementá-la novamente.

Como eu poderia definir uma variável assim?

    
por J.dd 03.03.2016 / 21:09

6 respostas

1

Você não pode. No entanto, você pode usar vários hacks para fazer isso, por exemplo, criando um arquivo em alguma pasta toda vez que um usuário efetua login ou adicionando uma linha a algum arquivo toda vez que um usuário efetua login. Isso seria fácil de implementar, mas ineficiente longo prazo. Uma operação muito mais eficiente seria gravar um número em um arquivo e alterá-lo. Você deve, no entanto, ter certeza de que o arquivo está estruturado como você deseja e de que o número esteja onde você espera que esteja. Como esses são hacks, eles não são perfeitos (o usuário mal-intencionado pode modificá-los), mas pode ser suficiente para o seu problema.

Você pode contar linhas com wc -l

    
por 03.03.2016 / 21:14
2

Eu escrevia:

#!/bin/bash
file=$HOME/.login_count
number=$(<"$file")
echo "Hello Mr. This is your $number log in"
echo $((number+1)) > "$file"
    
por 03.03.2016 / 21:31
1

A resposta de Matthew Rock é boa, assim como os outros, mas, como Matthew aponta, o usuário pode alterar esses números. Uma maneira de contornar isso é usar o PAM.

Eu colocaria a seguinte linha em /etc/pam.d/login

session optional pam_exec.so /usr/local/bin/{someshellscript}.sh

E em /usr/local/bin/{someshellscript}.sh , você pode usar variáveis como $PAM_USER , que fornece o nome de usuário. Então, no shellscript, você pode acessar um arquivo que não é gravável (e talvez não seja legível, depende do que você deseja) para os usuários e manter abas em todos os usuários e com que frequência eles efetuaram login nesse arquivo. Deixo a escrita desse roteiro como um exercício para o leitor; -)

    
por 05.03.2016 / 02:05
0

Aqui está um possível hack; adicione as seguintes linhas ao seu $ HOME / .bash_profile (desde que você marcou o bash):

NLOGINS=0
printf "Hello Mr. This is your %d log in\n" $((NLOGINS + 1))
sed -i 's/^NLOGINS=.*/NLOGINS='$((NLOGINS + 1))'/' $HOME/.bash_profile

Sempre que você fizer login, receberá a mensagem impressa e, em seguida, fará a auto-atualização do .bash_profile com a nova contagem de NLOGINS.

    
por 03.03.2016 / 21:29
0

Com zsh , você pode usar a matriz $mapfile special que dá acesso ao conteúdo de um arquivo como uma variável (cuidado com o acesso simultâneo).

#! /bin/zsh -
zmodload zsh/mapfile
echo "Hello Mr. This is your $((++mapfile[$HOME/.number])) log in"

fish tem as chamadas variáveis Universal cujo conteúdo é armazenado em arquivos em ~/.config e para o qual fish serializa o acesso por meio de algum mecanismo IPC.

#! /bin/fish -
set -U number (math "0$number+1")
echo "Hello Mr. This is your $number log in"
    
por 05.03.2016 / 00:37
0

Veja este post link

Variáveis permanentes usando kv-bash functions:

1) Faça o download do arquivo kv-bash do github :

git clone https://github.com/damphat/kv-bash.git
cp -ar ./kv-bash/kv-bash /usr/local
chmod +x /usr/local/kv-bash

# Put this line in .bash_profile (optional)
source kv-bash

2) Tente

#let try create/modify/delete variable
kvset myEmail [email protected]
kvset myCommand "Very Long Long Long String"

#read the varible
kvget myEmail

#you can also use in another script with $(kvget myEmail)
echo $(kvget myEmail)

#delete variable
kvdel myEmail
    
por 09.03.2017 / 08:25