C'est ma simple bash:
cat test.sh
#!/bin/bash
echo "hello"
su - root -c /path/to/script.sh <<EOF
password
EOF
whoami
echo "good bye"
Mais j'ai cette erreur:
./test.sh
hello
su: must be run from a terminal
<current-user>
good bye
(OU)
cat test2.sh
#!/bin/bash
echo "hello"
Sudo su <<EOF
password
EOF
whoami
echo "good bye"
Encore une autre erreur
(OU)
cat test3.sh
#!/bin/bash
echo "hello"
su root <<EOF
password
EOF
whoami
echo "good bye"
encore une fois d'erreur ...
quand j'essaie:
#!/bin/bash
echo "hello"
Sudo -s <<EOF
<password>
echo Now I am root
id
echo "yes!"
EOF
whoami
echo "good bye"
Ensuite, la sortie est la suivante:
./script.sh
hello
[Sudo] password for <user>:
J'ai aussi changé mon script à:
#!/usr/bin/expect -f
spawn Sudo -s <<EOF
expect "assword for user:"
send -- "password\r"
expect eof
et la sortie est:
spawn Sudo -s <<EOF
[Sudo] password for user:
/bin/bash: <<EOF: command not found
Aussi which sh
la sortie est /bin/sh
Comment puis-je résoudre l'erreur dans ces trois scripts?
Vous pouvez tuyer le mot de passe et l'envoyer dans la commande à l'intérieur du script.
echo "password" | Sudo -S
Mais ce n'est pas une bonne idée d'envoyer le mot de passe dans la ligne de commande. Si vous avez besoin de plus d'informations sur la connexion en tant que root du script, vous pouvez consulter la réponse fournie ici .
Toutefois, si elle est à des fins expérimentales, nous pouvons utiliser l'attente de saisir le mot de passe de la ligne de commande. Le script doit être modifié comme ci-dessous.
#!/usr/bin/expect -f
spawn Sudo -s <<EOF
expect "assword for username:"
send -- "user-password\r"
expect eof
La dernière ligne est nécessaire car nous devons appuyer sur l'entrée après avoir saisi le mot de passe. Comme Tian l'a suggéré, ce n'est pas une bonne idée d'envoyer le mot de passe root dans le script shell.
L'intégration du mot de passe root dans le script n'est pas une bonne idée, d'un point de vue de sécurité, c'est probablement pourquoi su tente de l'obtenir initialement à partir d'un terminal.
Utilisation Sudo
est un meilleur itinéraire à prendre, il est plus flexible, vous pouvez la configurer pour autoriser uniquement des commandes particulières, ou même certains utilisateurs d'exécuter un programme/script avec ou sans utiliser de mot de passe (man Sudo
).
@ La référence de Ketan est également à la lecture.
J'ai une réponse de ici
Faire ce genre de choses n'est pas une pratique sûre ou standard (en fait beaucoup le considère sinon catastrophique), ce n'est vraiment pas une bonne idée de mettre un mot de passe dans un script. Une approche plus standard serait simplement de s'attendre à ce que l'ensemble du script soit exécuté avec des privilèges root, ou d'avoir une invite de script pour un mot de passe. Vous pouvez également permettre à différentes commandes d'exécuter via sudo sans mot de passe par des utilisateurs particuliers en utilisant l'option NOPASSWD
dans /etc/suoders
.
Cependant, maintenant que vous connaissez les risques, il est possible d'utiliser Sudo -kS
avoir sudo lire le mot de passe de stdin
:
Sudo -kSs << EOF
password
whoami
echo "Not a good idea to have a password encoded in plain text"
EOF
Avez-vous essayé/etc/sudoers?
your_user ALL=(ALL) NOPASSWD: /path/to/script.sh
(Modifier avec: sudoedit/etc/sudoers) Ensuite, vous pourrez exécuter:
Sudo /path/to/script without password