While Loop sobre um comando de retorno de arquivo não encontrado

0

Estou tentando criar um script de shell simples para percorrer um arquivo linha por linha e executar um comando com cada linha como uma variável.

Aqui está o meu arquivo de texto:

FakeAccount
FakeUser 

Aqui está o meu script da shell:

#!/bin/bash

while IFS= read -r line; do
    "echo -e 'testpassword\ntestpassword' | passwd $line"
done < "User.txt"

A saída que eu recebo parece ser o que eu quero, a saída diz:

"linha 4: echo -e 'testpasswd \ ntestpasswd' | passwd FakeAccount: comando não encontrado"

"linha 4: echo -e 'testpasswd \ ntestpasswd' | passwd FakeUser: comando não encontrado"

Mas se eu copiar esta string exata: echo -e 'testpasswd \ ntestpasswd' | passwd FakeUser

o comando funciona muito bem, então por que o script de shell não está executando o comando e seu comando ditado não foi encontrado?

    
por lavarockman 23.10.2018 / 21:32

2 respostas

1

Ao colocar o comando e seus argumentos em aspas duplas, você apresentará a string inteira como um único comando que, como o shell indica, não foi encontrado.

O shell precisa executar a divisão de palavras para localizar listas de comandos, atribuições, comandos e seus parâmetros (consulte as seções de abertura de man bash para saber mais).

Não use aspas duplas em todo o pipeline, apenas cite a variável:

echo -e 'testpassword\ntestpassword' | passwd "$line"
    
por 23.10.2018 / 21:46
0

Você pode simplificar da seguinte maneira usando chpasswd :

while read -r user; do printf "$user:%s" "some_secret_pass" | chpasswd ; done < User.txt

Ou, se você quiser usar passwd , provavelmente precisará passar o sinal --stdin . Tanto quanto eu posso ver, isso é suportado em versões recentes do Fedora e do Centos

Usando passwd :

while read -r user; do printf %s\n "some_secret_pass" | passwd --stdin "$user" ; done < User.txt
    
por 23.10.2018 / 22:35