3 votes

La commande sed fonctionne dans le terminal mais pas à travers bash_aliases ou un script bash

À chaque mise à jour de Vivaldi, je dois exécuter cette commande sed pour appliquer custom.css

sudo sed -i '1s/^/@import "custom.css";/' /opt/vivaldi-snapshot/resources/vivaldi/style/common.css

Maintenant, la commande fonctionne bien dans le terminal mais pas lorsque j'essaie de l'exécuter en créant un alias dans ~/.bash_aliases ou même à travers un script bash (placé dans /bin/ avec les autorisations d'exécution). J'ai essayé d'utiliser le chemin complet pour "custom.css" mais cela n'a pas fonctionné non plus. Merci.

Éditer:

(1) À travers un alias:

alias vivupdate="sed -i '1s/^/@import "custom.css";/' /opt/vivaldi-snapshot/resources/vivaldi/style/common.css"

Lorsque j'ai essayé de l'exécuter, j'ai obtenu cette erreur:

$ sudo vivupdate
[sudo] password for admn:

sudo: vivupdate: commande introuvable
$ 

(2) À travers un script Bash:

#!/bin/bash
sed -i '1s/^/@import "custom.css";/' /opt/vivaldi-snapshot/resources/vivaldi/style/common.css

créé vivupdate.sh, rendu exécutable et placé à l'intérieur de /bin/.

Ensuite, j'ai édité le fichier sudoers et ajouté:

user ALL=(ALL:ALL) NOPASSWD:/bin/vivupdate.sh

Mais lorsque j'exécute le script dans le terminal, j'obtiens cette erreur:

sed: couldn't open temporary file /opt/vivaldi-snapshot/resources/vivaldi/style/sedCIt48u: Permission denied

4voto

Stewart Points 1385

Les alias ne sont pas disponibles pour sudo. Ils sont spécifiques à votre shell et à votre utilisateur, et sudo exécute des commandes en tant que root. Par conséquent, si vous avez besoin qu'un alias soit exécuté en tant que root, vous devez inclure le sudo dans la définition de l'alias lui-même. De plus, vous avez mal utilisé les guillemets pour l'alias, donc ça ne fonctionnerait pas de toute façon. Ce que vous voulez est :

alias vivupdate="sudo sed -i '1s/^/@import \"custom.css\";/' /opt/vivaldi-snapshot/resources/vivaldi/style/common.css"

Remarquez comment j'ai échappé les double guillemets internes (\"). Sans cela, puisque vous définissez l'alias avec des double guillemets, le deuxième double guillemet (celui avant "custom.css) signifiera la fin.


Le problème avec le script vient de la façon dont sed -i se comporte. Bien qu'il semble modifier le fichier d'origine, ce qui se produit en réalité est qu'il sauvegarde le fichier modifié en tant que copie temporaire, puis renomme le fichier en tant qu'original. Cependant, comme vous ne l'exécutez pas avec sudo, vous n'avez pas l'autorisation de le faire. La ligne que vous avez ajoutée dans le fichier sudoers signifie seulement que vous pouvez exécuter sudo vivupdate.sh sans mot de passe. Cependant, vous devez toujours l'exécuter avec sudo.

Il ne suffit pas d'ajouter la commande dans sudoers, vous devez toujours l'appeler avec sudo:

sudo /bin/vivupdate.sh

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X