web-dev-qa-db-fra.com

Impossible de lire dans le répertoire / root même si sudo

J'ai un script bash avec quelque chose comme

while read -r name value
do
    ....something
done < "test"

J'exécute ce script en tant qu'utilisateur normal.

Maintenant, je voulais stocker ce fichier dans le répertoire personnel /root et le lire à partir de là.
Faire

while read -r name value
do
    ....something
done < "/root/path/to/file"

bien sûr, j'ai l'erreur: ./script: ine xy: /root/path/to/file: Permission Denied

Que j'ai essayé

while Sudo read -r name value
do
    ....something
done < "/root/path/to/file"

Mais cela me donne: Sudo: read: unknown command

Pourquoi ne puis-je pas lire un fichier dans le répertoire de départ /root alors que j'utilise Sudo?

EDIT
J'ai essayé un peu plus loin et j'ai découvert que je ne pouvais même pas faire

$> Sudo echo "test" /root/.test
[Sudo] Password for user:
-bash: /root/.test: Permission Denied 

EDIT 2
Cela fonctionne comme je veux si je lance le script complet avec Sudo ./myscript mais je préfère ne pas le faire ... Y a-t-il un autre moyen?

1
derHugo

Pourquoi ça ne marche pas?

Votre approche ne fonctionne pas parce que vous lisez le fichier avec < "stdin", cela signifie que votre shell est chargé de la lecture du fichier et que vous l'avez exécuté avec un utilisateur régulier droit de lire le fichier. Sachez maintenant que l'exécution de la commande read à l'aide de Sudo ne vous aidera pas à ne pas mentionner que c'est un shell intégré qui ne peut pas être exécuté à l'aide de Sudo, comme cd etc.

Comment puis-je le faire fonctionner?

La seule chose que vous devriez faire est en quelque sorte de lire le fichier vi root ou un utilisateur/groupe avec les privilèges nécessaires. Donc, vous pouvez le faire comme:

Sudo cat /root/txt | while read -r name value;
do
  some command
done

dans ce cas, seul cat sera exécuté avec Sudo.

Cependant, la meilleure pratique consiste à mettre votre script dans /usr/local/bin afin que tout le monde ait accès à son exécution.

Notez également que lorsque vous souhaitez rediriger quelque chose vers /root/example, vous devez utiliser Sudo tee:

echo test | Sudo tee file

ou exécutez le script entier à l'aide de Sudo.

1
Ravexina

Le dossier/root est réservé à la racine. Je crois que seul le système peut manipuler des fichiers à cet endroit. vous pouvez essayer avec 'su' mais je pense que vous obtiendrez le même résultat.

deuxièmement: il n'est pas recommandé d'exécuter des programmes normaux avec des privilèges root.

lorsque vous utilisez Sudo dans la ligne de commande, vous fournissez le mot de passe et devenez root. le script ne peut pas faire cela. c'est une mesure de sécurité pour s'assurer que quelqu'un au terminal effectue les modifications. De plus, certaines actions et certains dossiers ne sont disponibles que pour le processus système racine.

2
ravery