zulassen, dass ein benutzer ohne rootberechtigung einen dienst neu startet
<p><strong>hintergrund :</strong></p><p>ich habe eine app namens <code>myapp</code> mit <code>spring-boot</code> erstellt. es besteht aus einem selbstausführbaren jar und ist mit systemd-diensten kompatibel. jetzt versuche ich es in jenkins zu integrieren.</p><p><strong>was ich will :</strong></p><p>ich möchte, dass jenkins in der lage ist:</p><ul> <li>beenden sie den dienst.</li> <li>ersetzen sie das glas.</li> <li>starten sie den dienst neu.</li> </ul><p><strong>problem :</strong></p><p>bisher können nur sudoer dienste starten/stoppen. ich möchte nicht, dass jenkins ein sudoer sind (es scheint chaotisch).</p><p><strong>aktuelle struktur :</strong></p><p>ich habe einen benutzer <code>myapp</code>, der einen ordner <code>/home/myapp</code> hat. das generierte glas heißt <code>myapp</code> und wird bei <code>/home/myapp</code> platziert. der benutzer <code>myapp</code> ist der eigentümer des generierten jar:</p><pre><code>myapp@myserver:~/backend$ ll total 53900 drwxrwxr-x 2 myapp myapp 4096 apr 25 17:09 ./ drwxr-xr-x 6 myapp myapp 4096 apr 25 17:08 ../ -rw-rw-r-- 1 myapp myapp 511 apr 20 16:13 application.properties -rwxr--r-- 1 myapp myapp 55175294 apr 20 19:06 backend-1.0-snapshot.jar* lrwxrwxrwx 1 myapp myapp 24 apr 20 19:20 myapp -&gt; backend-1.0-snapshot.jar* -rw-r--r-- 1 myapp myapp 179 apr 20 19:26 myapp.service </code></pre><p>ich habe einen ssh-schlüssel platziert, damit jenkins sich als <code>myapp@myserver</code> anmelden kann.</p><p>da <code>myapp</code> der eigentümer des jar ist, gibt es möglicherweise eine option, mit der der benutzer <code>myapp</code> <code>systemctl start/stop myapp</code> aufrufen kann. eigentlich kann ich <code>systemctl status myapp</code> aufrufen, aber nicht <code>start/stop</code> (root-passwort wird abgefragt).</p><p>irgendwelche vorschläge?</p>
<p><code>sudo</code> ist der richtige weg. erstellen sie eine neue gruppe (z. b. <code>appadmin</code>), fügen sie ihren <code>jenkins</code> benutzer hinzu und fügen sie mit <code>visudo</code> einen neuen eintrag mit einer begrenzten liste von befehlen hinzu, zum beispiel:</p><pre><code>cmnd\_alias myapp\_cmnds = /bin/systemctl start myapp, /bin/systemctl stop myapp %appadmin all=(all) myapp\_cmnds </code></pre><p>wenn sie möchten, dass die gruppe <code>appadmin</code> den dienst ohne vorherige eingabe eines kennworts ausführen kann (nützlich, wenn der benutzer beispielsweise nur durch einen ssh-schlüssel authentifiziert wird),</p><pre><code>cmnd\_alias myapp\_cmnds = /bin/systemctl start myapp, /bin/systemctl stop myapp %appadmin all=(all) nopasswd: myapp\_cmnds </code></pre>
hi@statia,herzlich willkommen in unserer community.tut mir leid, dass es bei dir einen zugriff durch dritte gibt. bitte wundere dich nicht, dass ich deinen post verschoben habe. wir haben das thema bereits vorliegen, daher habe ich ihn hierher verschoben.bitte ändere zuerst direkt deine zugangsdaten, indem du das passwort zurücksetzt. im nachfolgenden link findest du eine anleitung dafür, wie das passwort neu vergeben werden kann:ferne bitte ich dich, wobei dies vom gerät abhängt, alle automatischen logins zu entfernen. logge dich also einmal bewusst aus allen joyn apps aus, in denen du eingeloggt bist. ein schließen der app führt nicht automatisch zum logout aus der app, wodurch andere, wenn sie zugriff auf das gerät haben, beim Öffnen der app inhalte sehen können. root ist nicht nötig, es wird nur kurzzeitig die standard-sms-app umgestellt bzw. du musst das erlauben:  

[sms backup & restore - apps on google play](https://play.google.com/store/apps/details?id=com.riteshsahu.smsbackuprestore) <h2>moderne html5-techniken zum ändern von klassen</h2><p>moderne browser haben <a href="https://developer.mozilla.org/en-us/docs/dom/element.classlist"><strong>classlist</strong></a> hinzugefügt, das methoden zur verfügung stellt, mit denen klassen leichter ohne bibliotheken bearbeitet werden können:</p><pre><code>document.getelementbyid("myelement").classlist.add('myclass'); document.getelementbyid("myelement").classlist.remove('myclass'); if ( document.getelementbyid("myelement").classlist.contains('myclass') ) document.getelementbyid("myelement").classlist.toggle('myclass'); </code></pre><p>leider funktionieren diese in internet explorer vor version 10 nicht, obwohl es ein <a href="http://en.wikipedia.org/wiki/shim\_(computing)">shim</a> gibt, um die unterstützung für ie8 und ie9 hinzuzufügen, die unter <a href="https://developer.mozilla.org/en-us/docs/dom/element.classlist">diese seite</a> verfügbar ist. es wird jedoch immer mehr <a href="http://caniuse.com/#feat=classlist">unterstützt</a> .</p><h2>einfache browserübergreifende lösung</h2><p>die standard-javascript-methode zur auswahl eines elements ist <a href="https://developer.mozilla.org/en-us/docs/dom/document.getelementbyid"><code>document.getelementbyid("id")</code></a> . dies wird in den folgenden beispielen verwendet. sie können elemente natürlich auch auf andere weise erhalten. in der richtigen situation können sie stattdessen einfach <code>this</code> verwenden ins detail geht dies nicht in den rahmen der antwort.</p><h3>so ändern sie alle klassen für ein element:</h3><p>um alle vorhandenen klassen durch eine oder mehrere neue klassen zu ersetzen, legen sie das classname-attribut fest:</p><pre><code>document.getelementbyid("myelement").classname = "myclass"; </code></pre><p>(sie können eine durch leerzeichen getrennte liste verwenden, um mehrere klassen anzuwenden.)</p><h3>so fügen sie einem element eine zusätzliche klasse hinzu:</h3><p>um einem element eine klasse hinzuzufügen, ohne vorhandene werte zu entfernen/zu beeinflussen, fügen sie ein leerzeichen und den neuen klassennamen wie folgt hinzu:</p><pre><code>document.getelementbyid("myelement").classname += " myclass"; </code></pre><h3>so entfernen sie eine klasse aus einem element:</h3><p>um eine einzelne klasse zu einem element zu entfernen, ohne andere potenzielle klassen zu beeinflussen, ist ein einfacher regex-ersetzen erforderlich:</p><pre><code>document.getelementbyid("myelement").classname = document.getelementbyid("myelement").classname.replace ( /(?:^|\s)myclass(?!\s)/g , '' ) /* code wrapped for readability - above is all one statement */ </code></pre><p>eine erklärung dieser regex lautet wie folgt:</p><pre><code>(?:^|\s) # match the start of the string, or any single whitespace character myclass # the literal text for the classname to remove (?!\s) # negative lookahead to verify the above is the whole classname # ensures there is no non-space character following # (i.e. must be end of string or a space) </code></pre><p>das flag <code>g</code> weist das ersetzen an, nach bedarf zu wiederholen, falls der klassenname mehrmals hinzugefügt wurde.</p><h3>so prüfen sie, ob eine klasse bereits auf ein element angewendet wurde:</h3><p>der gleiche reguläre ausdruck, der oben zum entfernen einer klasse verwendet wurde, kann auch zur überprüfung verwendet werden, ob eine bestimmte klasse vorhanden ist:</p><pre><code>if ( document.getelementbyid("myelement").classname.match(/(?:^|\s)myclass(?!\s)/) ) </code></pre><p><br/></p><h3>zuweisen dieser aktionen zu onclick-ereignissen:</h3><p>es ist zwar möglich, javascript direkt in die html-ereignisattribute (z. b. <code>onclick="this.classname+=' myclass'"</code>) zu schreiben, dies wird jedoch nicht empfohlen. insbesondere bei größeren anwendungen wird durch die trennung von html-markup von javascript-interaktionslogik ein wartungsfähigerer code erzielt.</p><p>der erste schritt dazu ist das erstellen einer funktion und das aufrufen der funktion im onclick-attribut. beispiel:</p><pre><code>&lt;script type="text/javascript"&gt; function changeclass(){ // code examples from above } &lt;/script&gt; ... &lt;button onclick="changeclass()"&gt;my button&lt;/button&gt; </code></pre><p><sub><em>(es ist nicht erforderlich, dass dieser code in skript-tags enthalten ist. dies ist lediglich der kürze halber als beispiel gedacht. das einschließen von javascript in eine andere datei ist möglicherweise geeigneter.)</em></sub></p><p>der zweite schritt besteht darin, das onclick-ereignis aus dem html-code in javascript zu verschieben, beispielsweise mit <a href="https://developer.mozilla.org/en-us/docs/dom/element.addeventlistener">addeventlistener</a> </p><pre><code>&lt;script type="text/javascript"&gt; function changeclass(){ // code examples from above } window.onload = function(){ document.getelementbyid("myelement").addeventlistener( 'click', changeclass); } &lt;/script&gt; ... &lt;button id="myelement"&gt;my button&lt;/button&gt; </code></pre><p>(beachten sie, dass der window.onload-teil erforderlich ist, damit der inhalt dieser funktion <em>ausgeführt wird, nachdem der html-code</em> vollständig geladen wurde. andernfalls ist das myelement möglicherweise nicht vorhanden, wenn der javascript-code aufgerufen wird, sodass die zeile fehlschlägt .)</p><p><br/></p><h2>javascript frameworks und bibliotheken</h2><p>der obige code ist alles in standard-javascript enthalten. es ist jedoch üblich, entweder ein framework oder eine bibliothek zu verwenden, um allgemeine aufgaben zu vereinfachen und von behobenen fehlern und edge-fällen zu profitieren, an die sie beim schreiben des codes nicht denken.</p><p>während einige leute es für übertrieben halten, ein ~ 50 kb-framework für das einfache ändern einer klasse hinzuzufügen, ist die überlegung, wenn sie umfangreiche javascript-arbeiten ausführen oder etwas, das ungewöhnliches cross-browser-verhalten hat, eine überlegung wert.</p><p><em>(in groben zügen handelt es sich bei einer bibliothek um eine reihe von werkzeugen, die für eine bestimmte aufgabe entwickelt wurden, während ein framework im allgemeinen mehrere bibliotheken enthält und eine reihe von aufgaben ausführt.)</em></p><p>die obigen beispiele wurden im folgenden mit <a href="http://jquery.com">jquery</a> wiedergegeben, wahrscheinlich der am häufigsten verwendeten javascript-bibliothek (obwohl es auch andere gibt, die es zu untersuchen gilt).</p><p>(beachten sie, dass <code>$</code> hier das jquery-objekt ist.)</p><h3>klassen mit jquery ändern:</h3><pre><code>$('#myelement').addclass('myclass'); $('#myelement').removeclass('myclass'); if ( $('#myelement').hasclass('myclass') ) </code></pre><p>darüber hinaus bietet jquery eine verknüpfung zum hinzufügen einer klasse, wenn sie nicht angewendet wird, oder zum entfernen einer klasse, die folgendes ausführt:</p><pre><code>$('#myelement').toggleclass('myclass'); </code></pre><p><br/></p><h3>zuweisen einer funktion zu einem klickereignis mit jquery:</h3><pre><code>$('#myelement').click(changeclass); </code></pre><p>oder, ohne eine id zu benötigen:</p><pre><code>$(':button:contains(my button)').click(changeclass); </code></pre><p><br/></p> das kann ich leider erst heute nachmittag nach der arbeit machen oder kurz in der mittagspause (home office ftw).melde ich dann :)danke schon mal für die hilfe und die hammer tipps bisher.ok habs doch nebenher mal kurz machen können beim trinken holen.küche will aber root bridge bleiben, auch wenn ich das disable.wenn ich den reboot befehl in der adressleiste auswähle kommt “forbidden”. kann sie nur mit stecker ziehen neu starten.playbase ist nun lan, wohnzimmer hat sich eingekriegt und läuft nun mit sonos net. alle wm=0das mit dem reboot hab ich den foren schon mal gelesen, diese funktion wurde deaktiviert. geht leider nur mehr manuell. matrix siehtauch passabel aus. perfekt wenn dein connect wieder dabei ist. ok wenn die küche root sein will 🤩, dann lassen wir sie, solange sie alles im griff hat. das root umstellen funktioniert eben auch nur, wenn man die befehle eingibt und die exroot wie auch diegewünschte neu bootet.hm…, dann heißt es abwarten und beobachten ob’s so läuft wie du dir das erhoffstgrüßedom hi thomas, genau den mist habe ich auch seit ca. einer woche und vermute, dass das eine meiner apps seit einen update macht. leider konnte ich noch nicht herausfinden, welche app es ist und tappe noch im dunkeln. kannst du mir sagen, wo genau dir diese zeile aufgefallen ist und mit welchem logviewer? ich nehme an, die uid, die in deinem fall die 10159 ist, ist die der app, die einen intent sendet, um diese livemobilesearch. com seite in einem neuen firefox tab zu öffnen. du kannst herausfinden, welche app der uid zugeordnet ist, siehe z.b. hier (wie du muss ich auch leerzeichen in der url einfügen): android. stackexchange. com/questions/8452/how-can-i-find-app-name-by-uid
vermutlich hilft dann nur, die app zu deinstallieren und sich mit einer bewertung im play store zu beschweren, dass die app ungefragt irgendwelche dubiosen seiten im firefox öffnet. 
ich hoffe, ich kann damit helfen, bitte gib mir auch das feedback, wie du den log-eintrag gefunden hast, damit ich auch weiter komme. 
gruss, 
erik schau mal unter system/über mein system nach, ob da überall wm0 steht. wm0 gibt an, dass das sonos-net aktiv ist. sofern da wm1 steht, wäre es das wlan des routers. sofern wm1 da steht, bitte die zugangsdaten des wlan aus der sonos app löschen und das system neu starten i.d.reihenfolge router speaker (einer nach dem anderen).grußbernhard <p>ich verwende <a href="http://noscript.net/features">noscript</a> , aber liste jede site auf, die ich tatsächlich verwenden möchte.</p><blockquote> <p>wenn sie noscript installieren, werden javascript, java, flash silverlight und möglicherweise andere ausführbare inhalte standardmäßig <em> blockiert </em>. sie können <em> die ausführung von </em> javascript/java/... selektiv auf den websites zulassen, denen sie vertrauen. sie können einer site erlauben, skripte vorübergehend auszuführen, wenn sie nur zufällig oder dauerhaft surfen, wenn sie sie häufig besuchen und ihr wirklich vertrauen. dies bedeutet, dass noscript aus ihren eigenen browsergewohnheiten lernt und nach einer weile im hintergrund verschwindet. wenn sie jedoch auf eine schädliche webseite stoßen, wird es sofort wieder angezeigt, um ihren tag zu retten.</p> <p>wenn sie eine site mit blockierten skripten durchsuchen, wird eine benachrichtigung angezeigt, die der vom popupblocker ausgegebenen ähnelt.<br> sehen sie sich das symbol oder das statusleistensymbol an, um die aktuellen noscript-berechtigungen zu erfahren ...</p> <p><img src="https://i.stack.imgur.com/zfxkv.png" alt="http://noscript.net/noscript/ss0.png" title="noscript tooltip screen shot"></p> </blockquote> <ol> <li> <p>wenn sie als unternehmen verkaufen, schützen sie ihr privatvermögen vor verärgerten kunden, wettbewerbern und allen anderen, die sie ausprobieren möchten</p> </li> <li> <p>der verkauf unter einem firmennamen hilft bei der entwicklung einer marke. richtiger name ist langweilig. überlegen sie sich etwas kreatives und machen sie den namen bekannt.</p> </li> <li> <p>abhängig von ihrem speziellen namen und seiner herkunft haben einige leute möglicherweise bestimmte negative assoziationen oder ideen und entscheiden, dass sie ihren namen einfach nicht mögen, um mit ihnen in irgendeiner weise geschäfte zu machen (geben ihnen möglicherweise nicht nur 0,99 usd oder nehmen sogar ihre app kostenlos). ein firmenname schützt sie vor phobischen menschen.</p> </li> <li> <p>mit einer marke erhalten sie anerkennung für ihre neuen apps. wenn sie eine andere "advanced notes" -app einwerfen, besteht eine gute chance, dass sie unbemerkt bleiben. wenn sie es "coolcomp notes" nennen, wird es ein interesse wecken, wenn ihr name mit großartigen apps verbunden ist.</p> </li> <li> <p>eine marke hilft ihnen dabei, ihre apps einfach und konsistent zu benennen. anstatt zu kämpfen, um einen weiteren namen für ihre nächste app wie "super notes", "personal finances plus" usw. zu erfinden, können sie sie einfach zu "coolcomp notes", "coolcomp finances" machen. viel einfacher und erstellt ein portfolio.</p> </li> <li> <p>eine marke ist später einfacher und zu einem höheren preis zu verkaufen als eine sammlung zufälliger apps von einem typen namens "joshua carmody".</p> </li> </ol> Steht sie nicht in den Einstellungen der APP, ganz unten bei "APP-Informationen"?
 
Gruß  
cuter2 Dieses Problem tritt nach einem bestimmten Apple-Update auf. Hierbei werden bestimmte Prozesse beendet, die tomedo zum korrekten Arbeiten benötigt. Daher hilft in diesem Fall ein kompletter Neustart des Serverrechners weiter.   

  

Bitte beachten: Es reicht nicht aus, nur die Servertools neu zu starten. Der Rechner, der als Server fungiert, muss einmal komplett ausgeschaltet und wieder eingeschaltet werden, um die relevanten Prozesse neu zu starten.