Sudo und Probleme mit Java unter root

Hallo und Danke an Alle für eine Antwort.

ich möchte unter Linux (DSL) ein Programm starten, das mit „sh Programm.sh“ gestartet wird.
Dies funktioniert auch super, nur jetzt nehme ich dem Benutzer die Schreibrechte weg (will nicht, dass er schreibrechte bekommt), dann geht die Software nicht mehr, weil sie schreibrechte braucht.
Dann wollte ich das mit „sudo sh Programm.sh“ testen, weil der root ja weiterhin schreibrechte hat. Ob es funktioniert weiß ich nicht, da die Software JAVA benötigt und ich den Pfad zu Java auch eingerichtet habe. Nur unter dem root läuft die Software grundsätzlich nie, weil er Java nie findet, obwohl ich hier auch den Pfad genauso eingerichtet habe wie unter dem User vorher. Was mache ich falsch?
Was braucht ihr noch für Infos zum weiter helfen?

Danke für jede sinnvolle Hilfe!

Gruß
Werner

Hallo,

Nur unter dem root läuft die Software grundsätzlich
nie, weil er Java nie findet

Wie äußert sich denn das nicht finden von Java genau? Gibt es eine Fehlermeldung? Wenn ja, wie lautet die?

Gruß

Fritze

Hallo Werner,

unter dem root läuft die
Software grundsätzlich nie, weil er Java nie findet, obwohl
ich hier auch den Pfad genauso eingerichtet habe wie unter dem
User vorher.

Zusätzlich zur Frage von Fritze: Was heisst das genau, „den Pfad genauso eingerichtet wie unter dem User vorher“? Ich nehme an, Du hast den Pfad zu Java angehängt, also

export PATH=$PATH:stuck\_out\_tongue:fad\_zu\_Java

aber wo hast Du das getan, in /etc/profile, /etc/bash.bashrc, ~/.bashrc …?
Und hat es einen Grund, daß Du dein Skript mit sh aufrufst? Was sagt denn env bei dir?
Im Prinzip sollte es ja reichen, wenn Java im Path liegt. Bei mir (Etch) führt eine Kette von Softlinks zu Java:
Das Verzeichnis /usr/bin ist im Pfad eingetragen, dort liegt ein Softlink /usr/bin/java, der auf /etc/alternatives/java zeigt, was wiederum ein Softlink auf /usr/bin/gij-wrapper-4.1 ist. Dieser Wrapper ruft dann gij als Java-Interpreter auf. Diese Lösung mit wrapper ist deshalb vorzuziehen, weil sie solche Sachen mit entziehen der Schreibrechte und sudo überflüssig macht. Der User kann in seinem Skript java benutzen, das dann tatsächlich über den wrapper ausgeführt wird, der alle „bösen Sachen“ verhindert. Funktioniert wunderbar.

Viele Grüße
Marvin

Hallo,

Dies funktioniert auch super, nur jetzt nehme ich dem Benutzer
die Schreibrechte weg (will nicht, dass er schreibrechte
bekommt),

Warum willst Du das eigentlich nicht?

dann geht die Software nicht mehr, weil sie
schreibrechte braucht.

Wo braucht sie die denn?

Dann wollte ich das mit „sudo sh Programm.sh“ testen, weil der
root ja weiterhin schreibrechte hat.

Sowas als root laufen zu lassen klingt nun aber nach einer superschlechten Idee. Du solltest gegebenenfalls einen extra Benutzer für dieses Programm einrichten.

Ob es funktioniert weiß
ich nicht, da die Software JAVA benötigt und ich den Pfad zu
Java auch eingerichtet habe. Nur unter dem root läuft die
Software grundsätzlich nie, weil er Java nie findet, obwohl
ich hier auch den Pfad genauso eingerichtet habe wie unter dem
User vorher.

Bitte führe „echo $PATH“ einmal als User und dann als root aus.

Was mache ich falsch?

Wenn Du es wirklich wissen willst: im Augenblick noch alles.

HTH,

Sebastian

Hallo Mervin, Hallo Fritze,

Danke für eure Hilfe schonmal!

Ich nehme an, Du hast den Pfad zu Java angehängt, also

export PATH=$PATH:stuck_out_tongue:fad_zu_Java
aber wo hast Du das getan, in /etc/profile, /etc/bash.bashrc, ~/.bashrc …?

–>ich habe das in /etc/bash.bashrc und ich kann es ja auch direkt in die Konsole eingeben.
Der Fehler äußert sich ungefähr so, dass er den Java-Befehl nicht findet und dann meckert, dass er in Zeile 24 des Programms hängen bleobt, weil hier java benötigt wird. Auch wenn ich direkt „java“ eintippe funktioniert das unter dem User und er gibt die Version und eine kleine Hilfe raus - unter dem root kommt nur, dass er den Befehl nicht kennt.

Auch ohne sudo (direkt vom root aus) sollte das Ganze eigentlich funktionieren - tut es aber nicht. Ich hab auch schon das Ganze Java in das Programmverzeichnis kopiert, dass er keinen Pfad braucht - geht auch nicht…???

Gruß
Werner

Und hat es einen Grund, daß Du dein Skript mit sh aufrufst? Was sagt denn env bei dir?

–> keine Ahnung - ich kenne mich nicht so super aus und habe das immer mit sh gemacht - aber der Pfad zu Java ist trotzdem nicht da - den env muss ich testen…

Hallo Sebastian,

Zu deiner Frage, warum der User keine Schreibrechte haben soll:
Das Programm verwaltet Listen, die niemand im Editor ändern soll, da das Programm hier viele Regeln bereithält. Leider gibt es User, die gerne Regeln umgehen!

Das Programm braucht schreibrechte, da es die Listen natürlich ändern soll!

Sowas als root laufen zu lassen klingt nun aber nach einer superschlechten Idee. Du solltest gegebenenfalls einen extra Benutzer für dieses Programm einrichten.

–> hab ich auch probiert - ich habe hier nur das Beispiel mit dem root, weil das wirklich einfacher zum Testen ist - ist mir völlig egal, was das für Nachteile hat - wenn es unter dem root läuft, kann ich weiter probieren…

Bitte führe „echo $PATH“ einmal als User und dann als root aus.

–> mach ich!

Gruß
Werner

Hallo Werner,

Der Fehler äußert sich ungefähr so, dass er den Java-Befehl
nicht findet und dann meckert, dass er in Zeile 24 des
Programms hängen bleobt, weil hier java benötigt wird.

Ich glaube dir ja, aber ich habe gelernt, daß es besser wäre, wenn Du mal den genauen Text der Fehlermeldung hier postest.

wenn ich direkt „java“ eintippe funktioniert das unter dem
User und er gibt die Version und eine kleine Hilfe raus -
unter dem root kommt nur, dass er den Befehl nicht kennt.

Na, das ist doch schon was. Wenn unter root java direkt nicht gefunden wird, wie soll es dann in einem Skript, von root gestartet, gefunden werden?
Führst Du das Skript als root in der Konsole aus (dieses schmuck- und farblose Fenster, alles nur schwarz-weiss :wink: oder in einem Terminal in einem schmucken, bunten X-Windows? Ich frage deshalb, weil im ersten Fall die Datei /etc/bash.bashrc nicht eingelesen wird.
Aber am besten ist es wirklich, wenn Du mal die Ausgabe von echo $PATH mitteilst. Du kannst ja diesen Befehl einfach als erste Zeile in dein Skript eintragen und das einmal als root und dann als normaler User ausführen.

Und hat es einen Grund, daß Du dein Skript mit sh aufrufst?
Was sagt denn env bei dir?

–> keine Ahnung - ich kenne mich nicht so super aus und
habe das immer mit sh gemacht

Das spielt hier keine grosse Rolle, ein Aufruf mit sh verhält sich leicht anders:
If bash is invoked with the name sh, it tries to mimic the startup behavior of historical versions of sh as closely as possible, while conforming to the POSIX standard as well.
(s. man bash)
aber das dürfte für dein Problem keine Rolle spielen. Ich hatte nur gefragt, weil mir so ein Aufruf persönlich etwas umständlich ist. Ich bevorzuge immer die sogenannte Shebang-Zeile

#!/bin/bash

als erste Zeile eines Skriptes. Da reicht es dann, dem Skript-File mit

chmod +x

ausführbar zu machen, und schon kann das Skript einfach durch Eingabe von

./mein\_Skript

gestartet werden. Aber sowas ist eben Geschmackssache.

  • aber der Pfad zu Java ist
    trotzdem nicht da - den env muss ich testen…

Ja, mach das mal.

Viele Grüße
Marvin

Nachtrag
Hallo Werner,
habe doch noch was vergessen. Auf jeden Fall wäre es besser, den Path in /etc/profile zu ergänzen, wenn er für alle gelten soll, oder für einzelne User eben in ~/.bash_profile, bzw. ~/.bashrc für einzelne User.
Bei /etc/profile musst Du aufpassen, da werden in der Regel zwei Pfade definiert:

if ["`id -u`" -eq 0]; then
 PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
 PATH="/usr/local/bin:/usr/bin:/bin:/usr/games"
fi

Der erste Pfad ist für root, der zweite für alle anderen User.

Viele Grüße
Marvin

Hallo,

Zu deiner Frage, warum der User keine Schreibrechte haben
soll:
Das Programm verwaltet Listen, die niemand im Editor ändern
soll, da das Programm hier viele Regeln bereithält. Leider
gibt es User, die gerne Regeln umgehen!

Okay.

Sowas als root laufen zu lassen klingt nun aber nach einer superschlechten ::Idee. Du solltest gegebenenfalls einen extra Benutzer für dieses Programm ::einrichten.

–> hab ich auch probiert - ich habe hier nur das Beispiel
mit dem root, weil das wirklich einfacher zum Testen ist - ist
mir völlig egal, was das für Nachteile hat - wenn es unter dem
root läuft, kann ich weiter probieren…

Ehrlich: das ist eine schlechte Herangehensweise. Versuch es als extra User, dann reden wir weiter.

Bitte führe „echo $PATH“ einmal als User und dann als root aus.

–> mach ich!

Ja, das Resultat dessen darfst Du uns gerne verraten.

Gruß,

Sebastian

Hallo Marvin,

Danke für die ausführliche Hilfe!!

die genaue Fehlermeldung ist:
Programm.sh: Line24:java:command not found

mitlerweile habe ich es geschafft, dass der root die Software starten kann, aber nur wenn ich den Pfad vorher direkt eintippe.
In die /etc/profile habe ich das eingetippt, funktioniert aber nicht.

mit echo $PATH kommt der Pfad nur beim User und nicht beim root - hier fehlt der Pfad zum Java völlig - wie erwartet.

Wenn ich aber den Pfad von Hand eintippe klappt das beim root, nur mit sudo kommt die selbe Fehlermeldung wie oben, wenn der Pfad nicht gesetzt ist…

ich tippe alles unter der graphischen Oberfläche in ein Terminal ein.
meistens lasse ich den root und den User in einem getrennten Terminal laufen, da das übersichtlicher ist.

mit env komm ich gar nicht klar, was ich damit machen soll - ich denke aber, dass das mit sh klappen müsste…

Gruß
Werner

Hallo Werner,

In die /etc/profile habe ich das eingetippt, funktioniert aber
nicht.

Was genau hast Du eingetippt? Poste hier mal die ganze, veränderte /etc/profile. Und verrate mal, in welchem Verzeichnis bei dir Java liegt. Wenn ich das weiss, kann ich eine andere Lösung versuchen. Normalerweise sollte das mit /etc/profile funktionieren, weil diese Datei von jedem User beim Einloggen ausgeführt wird.

mit env komm ich gar nicht klar, was ich damit machen soll -

Normalerweise nur in einem Terminal den Befehl

env

eingeben, da kommt dann relativ viel Ausgabe, u.a. auch der Wert von PATH, aber den haben wir ja auch mit echo $PATH schon erhalten, ist also nicht mehr so wichtig.

ich denke aber, dass das mit sh klappen müsste…

Ja, müsste es auch. Die Sicherheitsbedenken von Sebastian sind allerdings völlig berechtigt, so ein Skript sollte nicht als root laufen, aber im Moment spielen wir ja nur auf der eigenen Maschine rum, versuchen wir also erstmal den Path ordentlich einzurichten.
Im Prinzip müsste es so laufen: Du gibst als root folgenden Befehl in einem Terminal ein:

ln -s /vollständiger/pfad/zu/java /usr/bin/java

wobei Du für /vollständiger/pfad/zu/java genau diesen Pfad einsetzt, mit dem Befehl als letztes, mit dem bei dir java aufgerufen wird. Wahrscheinlich also tatsächlich java (kann aber auch anders sein, wie bei mir z.B.)
Ich hoffe, das war verständlich genug. Wenn nicht, frage ruhig zurück.

Viele Grüße
Marvin

Hallo Marvin,

Was genau hast Du eingetippt? Poste hier mal die ganze,
veränderte /etc/profile. Und verrate mal, in welchem
Verzeichnis bei dir Java liegt.

–> ich hab das Problem, dass der Rechner total unabhängig ist und nirgends angebunden ist…ich müsste also alles abtippen.
Ich denke auch mitlerweile, dass ich mehr ein Problem mit dem Pfad habe als mit dem eigentlichen Problem, weshalb ich angefangen hatte…
ich werde mich, wenn ich mal wieder zu Hause bin, ein wenig hier einlesen und dann vielleicht gezielter nachfragen - will hier nicht alles auf dich abwälzen…

…das mit dem ln -s hat auch nicht geklappt…

Vielen Dank nochmal für deine Hilfe!
Gruß
Werner