0
votes

Comment passer une valeur avec un $ à un programme exécuté à SU?

Je dois exécuter l'un des script comme ci-dessous:

su - Oracle -C 'CD / TMP / SOITPATH; sh -x myscript.sh arg1 arg2 arg3 OBJ $ _JGHD $: JHDBCDJ: HSHABSH ' P> BlockQuote>

Où Arg4 (OBJ $ _JGHD $: JHDBCDJ: HSHABSH) doit être traité comme un argument et appelez-vous en boucle dans myscript.shsh Vous trouverez ci-dessous le code d'exemple P>

echo $S_Object
S_Object='obj$ jhdbcdj hshabsh'


6 commentaires

Si vous souhaitez échapper à une valeur pour être en sécurité pour analyser en tant que code, utilisez printf% q pour le faire automatiquement; N'essayez pas de le faire vous-même avec sed .


Pouvez-vous être précis sur la manière dont id1 , id2 , id3 , etc. sont censés être combinés dans arg1 , arg2 , arg3 et votre chaîne finale? (Est-ce une constante fixe? Qu'est-ce que est it?)


pourquoi essayez-vous de supprimer le : s en arg4? Nous voyons cela dans votre code, mais je ne vois aucune description textuelle de l'intention.


BTW, pour comprendre pourquoi Vous ne devez pas ajouter de "s'échapper" aux chaînes littérales, voir Bashfaq # 50 ; Les mêmes malentendus qui conduisent aux pratiques que la FAQ traite de ceux qui conduisent à essayer de mettre des caractères d'évacuation (qui sont syntaxes) dans le contenu des variables de chaîne (qui sont des données).


Malheureusement, la façon dont votre script est en cours d'exécution détruit des informations avant même que le script ne soit même démarré, car la coque que su est en train de remplacer $ £ _ jghd Avec une chaîne vide (puisqu'il n'y a pas de variable de ce nom).


BTW, vous marquez ce bash , mais en utilisant sh . Ce sont deux coquilles différentes - si l'utilisation de sh est délibérée, je suggérerais de changer la balise. ( sh ne garantit pas de fonctionnalités non décrites dans la spécification POSIX SH; même si votre système d'exploitation utilise une copie de sh fourni par bash, il éteint certaines fonctionnalités lorsque invoqué sous ce nom).


3 Réponses :


0
votes

J'ai corrigé les erreurs de syntaxe et les idiomes obsolètes de votre script.

Ceci semble fonctionner: xxx

S'il vous plaît laissez-moi savoir s'il aide!


5 commentaires

Cela n'a pas beaucoup aidé. S_Object = 'obj $ jhdbcdj hshabsh'


J'ai supprimé SED 'S / $ / \ $ / g' semble que $ pasappe n'est pas nécessaire


toujours, la chaîne complète ne vient pas après $ signe


Vous n'expliquez pas ce que devrait viennent après le $ , alors comment est-ce que quelqu'un est que vous êtes censé savoir si une réponse est correcte?


avec myscript.sh j'ai passé obj $ £ £ € $ alors autre chaîne avec: Saperated. Mais obtenir obj $ donc _jghd $ est ignoré après le premier $



1
votes

Malheureusement, vous devrez corriger le code qui démarrait votre script - la variable nom est déjà corrompu avant le démarrage du script, car la coque que su invoque remplace $ _ jggd avec une chaîne vide avant que le script explicite sh -x est appelé.

Pour générer du code contenant des données, utilisez printf% q , comme suit: xxx

Notez l'utilisation de bash, pas sh , comme printf% q n'est pas présent dans les coquilles de base de POSIX et n'est en outre garantie de générer une sortie compatible POSIX. (Par conséquent, pour que cela soit fiable avec toutes les valeurs possibles, l'utilisateur oracle doit être configuré avec bash comme coquille).


Alternativement, vous pouvez transmettre des valeurs via l'environnement: xxx

réaffectation valeur sur la même ligne que su le met dans SU de l'environnement, qui est ensuite hérité par le shell en expansinant ultérieurement $ valeur .


11 commentaires

En fait, SU - Oracle -C sera ajouté dans l'outil que je ne peux pas supprimer. afin qu'il ait besoin de courir comme su - oracle -c 'sh myscript.sh arg1 arg2 arg3 "Valeur $" J'ai essayé "$ valeur", mais cela n'a pas non plus fonctionné.


Signaler un bogue à cet autre auteurs de l'outil. Ce qu'ils font ne sont pas seulement traitant des données de manière non contrainte, il s'agit également d'une préoccupation de sécurité puisqu'elle évalue les données comme s'il s'agissait de CODE.


su - oracle -c 'sh myscript.sh "obj $ €: JHDBCDJ: HSHABSHJ"' obj $ jhdbcdj hshabsh tellement au-dessus de la sortie que je reçois mais il devrait être obj € JHDBCDJ HSHABSH


Si votre coquille extérieure est bash, vous pouvez utiliser su - oracle -c $ 'sh gaw_stats.sh \' obj £ €: JHDBCDJ: HSHABSH \ '' qui ne fonctionnera pas si court de < code> sh , cependant.


La chose importante à propos de ce qui précède est que cela utilise des guillemets simples autour de la valeur littérale avec le $ s. Vous pouvez utiliser des guillemets doubles autour d'une expansion paramètre qui se développe à cette valeur, mais vous ne pouvez pas les utiliser autour de la valeur littérale elle-même.


Je ne peux pas ajouter $ juste après SU - Oracle -C. Si je l'ajoute après avoir entré dans l'outil, il fonctionnera comme su - oracle -c '$ sh myscript.sh ....


'$' ... '...' est un alternatif pour bash . C'est la syntaxe, pas quelque chose que vous pouvez mettre dans vos données. (Franchement, on me sens comme confondre la différence entre la syntaxe et les données est la moitié de la cause de cette question. Utilisation de SU provoque un Eval Pass lorsque la coquille qu'il invoque à analyser la Script il est passé, la ligne entre syntaxe et données fait est floue à ce point - mais il faut comprendre que c'est une exception, pas la règle, de penser tout droit sur ce qui se passe au moment de l'exécution ).


Quoi qu'il en soit, exactement Comment se passe l'outil que vous ne pouvez pas modifier invoquer su ? Les détails précis importent, si nous allons munisser vos données dans une forme que la coque su invoque interpréter correctement. Il se peut que cela ne puisse pas être corrigé, mais nous ne pouvons pas savoir de toute façon avant de voir la mise en œuvre sans simplifications ni modifications.


(ou plutôt, jusqu'à ce que nous voyions un exemple de reproductible minimal - le code le plus court possible que reproduit le problème exact et décrit quelles pièces peuvent être modifiées et ne peuvent pas être modifiées dans le cadre d'une solution proposée; si une question ne permet pas aux gens d'essayer de répondre à ce qu'ils sont et ne sont pas autorisés à changer, comment quelqu'un peut-il construire une réponse solide?)


... Mais de toute façon, vous devez utiliser $ '...' Lorsque vous passez des données sur le script, vous ne pouvez pas passer du script parent, vous pouvez modifier . Si vous exécutez ./ myProgram $ 'foo \ nbar' , le $ ne fait pas partie du fichier myprogram reçoit - c'est juste le Syntaxe que votre coquille est analysée pour comprendre qu'il devrait passer myProgram un argument qui se compose du mot foo , puis un littéral nouveauline, puis le mot bar ; Le signe du dollar et les citations sont supprimés par cette coquille de parent une fois qu'elle les utilise pour informer la manière dont elle devrait faire l'analyse. (Même la barre oblique inverse n'est pas transmise à myProgram non plus!).


L'autre motif importante d'utiliser intégré printenv est que l'option -v est impossible dans la commande externe. Sur mon système Linux, / usr / bin / printf génère une sortie plus portable, mais doit évidemment être dans une substitution de commande si nous devons attribuer à cmd .



0
votes

Modifier la deuxième commande SED en SED 'S / $ / $ € / G' Ensuite, vous devriez obtenir votre sortie souhaitée.


0 commentaires