La commande ne fonctionne pas sur le shell mais sur l'invite

1

Je suis un débutant en Linux Shell Script. Je veux changer l'adresse IP par Linux Shell Script et appelée par une application Web PHP.

J'ai terminé mon application Web PHP et le script shell. Avant qu'ils ne se combinent et fonctionnent, j'aimerais vérifier si le script shell peut fonctionner correctement.

Mon Linux Shell Script stockera 7 variables sans $ 0 (le nom du script) .:

  1. Le fichier d'interface réseau ( /etc/sysconfig/network-scripts/ifcfg-{XXX})
  2. Ancienne adresse IP
  3. Nouvelle adresse IP
  4. Ancien masque de sous-réseau
  5. Nouveau masque de sous-réseau
  6. Ancienne passerelle
  7. Nouvelle passerelle

La plupart des vérifications ont déjà été effectuées par mon application PHP car je suis un novice en Linux Shell Script, je ne veux pas le faire sur mon script shell. Mon application PHP peut s’assurer que les données sont correctes et remplies de valeurs.

Donc, pour exécuter ce script shell, je tape ce qui suit pour voir les résultats:

sh ./ipchanger.sh /etc/sysconfig/network-scripts/ens32 192.168.1.18 192.168.1.201 32 24 192.168.1.1 192.168.1.1 

Sens:

  1. Spécifiez le fichier de scripts réseau cible.
  2. Changer l'adresse IP de 192.168.1.18à 192.168.1.201.
  3. Changer le masque de sous-réseau de 255.255.255.255à 255.255.255.0.

En fait, il lancera les commandes suivantes:

sudo sed -i -r "s/$currentIpAddress/$newIpAddress/g" $fileName
sudo sed -i -r "s/$currentSubnetMask/$newSubnetMask/g" $fileName
sudo sed -i -r "s/$currentGateway/$newGateway/g" $fileName

Il ne renvoie aucune erreur et son aspect est correct, car la date de la dernière modification du fichier de script réseau a été mise à jour. Mais quand j'ai ouvert le fichier, rien n'a changé.

Puis je echoles commandes, il retourne la commande exacte que je voulais. Ensuite, je lance les trois lignes à l’invite de commande et vérifie le fichier à nouveau, toutes les informations ont changé!

AkiEru
la source
Si votre problème ne correspond pas à la situation sudo, comme @davidgo l'a suggéré, vous pouvez vérifier que les deux interfaces utilisent le même shell. vous pouvez essayer d’exécuter echo $SHELLou ps -p $$dans les deux interfaces pour confirmer qu’elles sont identiques.
Frank Thomas

Réponses:

0

Le problème est probablement le sudobit au début de chaque ligne. sudoimplique «exécuter en tant que root». Vous constaterez probablement que, dans les faits, le compte auquel vous êtes connecté en ligne de commande a été configuré /etc/sudoerspour fonctionner à partir de la ligne de commande, mais pas via le script PHP - et vous devez en effet Considérez les implications de ceci lorsque vous l'exécutez via l'utilisateur Web - l'utilisateur Web ne sera probablement pas configuré dans /etc/sudoers- et ne devrait pas l'être!

Vous pouvez tester cette théorie en modifiant la propriété des fichiers et en exécutant le script sans sudo. Pour changer la propriété du fichier, simplementchown filename.ext

Je pense que vous seriez mieux lotis:

  1. Créer un nouveau répertoire sous /var/www(ou partout où vous êtes à l'aise et où l'internaute a accès)
  2. Déplacer les fichiers de configuration appropriés dans ce répertoire
  3. En liant les fichiers individuels ou le répertoire qui les contient à l’adresse www.
  4. CHANGER LA PROPRIÉTÉ DE CES FICHIERS DANS LE RÉPERTOIRE WWW
  5. Déposez le sudo au début de chaque commande. Mieux, pourquoi ne pas appeler le script et simplement écrire les modifications en PHP.
Davidgo
la source
Après avoir supprimé le sudoau début de chaque ligne, cela fonctionne toujours!
AkiEru
Que dit "whoami" et quelle est la commande de type "exec" de PHP que vous utilisez?
davidgo
whoamimontre apache
AkiEru
Cela fait peu de sens. Est-ce que cela se produit lorsque vous l'exécutez à partir de l'invite bash ou via le script? Quelles sont les autorisations sur les fichiers?
davidgo
Maintenant, je peux faire en sorte que le script shell change l'adresse IP. Mais en PHP, ça ne pouvait pas.
AkiEru