Função Zsh com su e echo

3

Estou tentando adicionar uma função ao meu .zshrc que facilita a adição de novos sinalizadores de USE ao meu arquivo /etc/portage/package.use . Normalmente, eu teria que fazer

su -c 'echo "net-misc/aria2 bash-completion bittorrent" >> /etc/portage/package.use'

Então, tentei criar uma função como

new_use() {
    su -c 'echo "$1" >> /etc/portage/package.use'
}

mas depois percebi que não funcionaria. Eu quero saber se há uma maneira de fazer essa função funcionar, ou pelo menos se as funções são apropriadas para isso. By the way, não me importo de ter que digitar a senha de root toda vez que eu chamo a função.

    
por user1002327 06.01.2013 / 03:31

3 respostas

3

Basta inverter as aspas.

new_use() {
    su -c "echo '$1' >> /etc/portage/package.use"
}

Isso fará com que $1 seja expandido antes da execução de su .

    
por 06.01.2013 / 04:01
7

Você pode alimentar stdin para um programa com privilégios de root, assim:

new_use() {
    sudo tee -a /etc/portage/package.use <<< "$1" > /dev/null
}
    
por 06.01.2013 / 04:06
3

O argumento da função não é passado para o shell subjacente. Você pode substituir o argumento dentro da string que su irá passar para o shell de root, mas tenha cuidado que a string será analisada pelo shell de root, então caracteres especiais serão expandidos. Para evitar essa expansão extra (que pode fazer com que um código arbitrário seja executado como root), interpole a string entre aspas simples (o que faz com que todos os caracteres diferentes de ' sejam interpretados literalmente) e proteja aspas simples na string ( '\'' termina o literal da string, acrescenta uma aspa simples e inicia um novo literal, o que significa que '\'' é efetivamente uma maneira de colocar uma aspa simples dentro de um literal delimitado por aspas simples).

new_use() {
  su -c "echo '${1//\'/\'\\'\'}' >> /etc/portage/package.use"
}

Outra abordagem possível é usar tee .

    
por 06.01.2013 / 22:38