Schrift
[thread]9239[/thread]

ueberpruefen ob commandline leer ist



<< |< 1 2 >| >> 20 Einträge, 2 Seiten
RPerl
 2007-07-28 12:44
#79015 #79015
User since
2006-11-26
384 Artikel
BenutzerIn

user image
Hallo,

also das ist eigentlich richtig seltsames Verhalten. Sieht so aus: Ich hab ein Script mit Getopt::Long das Parameter ueber argv nimmt.
So, nun wollte ich eine Hilfe augeben, wenn KEIN Parameter uebergeben wurde. Aber perl zeigt beides. Hilfe als auch Subfunktionsausgabe vom Parameter. Warum?!

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
my $result = GetOptions ("change" => \&change,
            );


if(!@ARGV) {
print "Hallo!\n";
print "------------------------------------------------------\n";
print "-c / --change \t changes all files\n";
exit();
}

sub change {
print "foo";
}


Der soll entweder, wenn nix uebergeben wurde, die Hilfe zeigen, oder WENN was uebergeben worden ist, die Hilfe weglassen und stattdessen simpel die Subfunktion aufrufen.
Aber passiert nicht

Warum?!

Vielen Dank und Gruß

rPerl\n\n

<!--EDIT|RPerl|1185612732-->
ptk
 2007-07-28 12:51
#79016 #79016
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Erstmal möchtest du nicht $ARGV, sondern @ARGV benutzen.
Und dann solltest du beachten, dass GetOptions alle baearbeiteten Optionen aus @ARGV entfernt.
RPerl
 2007-07-28 12:56
#79017 #79017
User since
2006-11-26
384 Artikel
BenutzerIn

user image
> Erstmal möchtest du nicht $ARGV, sondern @ARGV benutzen.
jo, uebersehen. Stand aber auch in der Doku.

Das heisst?

// EDIT: Habs mal ueber eine weitere Subfunktion geloest, scheint ja nicht anders zu gehen, auch wenn ich das schwach finde..\n\n

<!--EDIT|RPerl|1185613382-->
renee
 2007-07-28 13:04
#79018 #79018
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/perl

use strict;
use warnings;
use Getopt::Long;

GetOptions( 'change' => \my $change );

if( $change ){
    print "change gesetzt";
}
else{
    print "change nicht gesetzt";
}


Code: (dl )
1
2
3
4
5
F:\>perl change.pl
change nicht gesetzt
F:\>perl change.pl -change
change gesetzt
F:\>
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
RPerl
 2007-07-28 13:05
#79019 #79019
User since
2006-11-26
384 Artikel
BenutzerIn

user image
ach so geht das...
gleich mal testen, thx
wusst ich garnicht

// edit: gilt das auch fuer subfunktionen?\n\n

<!--EDIT|RPerl|1185613582-->
renee
 2007-07-28 13:50
#79020 #79020
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Was meinst Du mit "gilt das auch für subfunktionen"??
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Linuxer
 2007-07-28 14:10
#79021 #79021
User since
2006-01-27
3881 Artikel
HausmeisterIn

user image
Hi,

wenn Du @ARGV auf Inhalt prüfen willst, musst Du das vor GetOptions() tun, den GetOptions() modifiziert @ARGV.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/perl
# vi:ts=4 sw=4 et:
use strict;
use warnings;
use Getopt::Long;

# http://board.perl-community.de/cgi-bin/ikonboard/ikonboard.cgi?act=ST;f=6;t=4491

#> global variables
#> ----------------------------------------------------------------------------

my $change = 0;

#> main script
#> ----------------------------------------------------------------------------

if ( !@ARGV ) {
    die "you didn't mention any options. see help for more.\n";
}
else {
    my $result = GetOptions( "change" => \$change );
    # check $result ...
}

if ( $change ) {
    print "Wanna change...\n";
}
else {
    print "nothing to change...\n";
}

__END__
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
RPerl
 2007-07-28 14:58
#79022 #79022
User since
2006-11-26
384 Artikel
BenutzerIn

user image
klar, klar. aber da funktioniert nicht mit subfunktionen.
Ich kann nicht einfach

Code (perl): (dl )
if ( $change ) {


machen. Weil ich kein $change habe sondern &change. Also eine Subfunktion

Naechstes Problem: Ich mach das jetzt nicht direkt in 'n neuen Thread. Aber kann perl keine Dateien "tauschen"?

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
sub lock {
open(FH,"+>/etc/passwd");
while (<FH>) {
    my $tmp1 = $_;
    #($tmp1 = $_) =~ s/bin\/bash/\/bin\/false/m;
     ($tmp1 = $_)  =~ s/\/bin\/(.*)/\/bin\/false/m;        # I HATE REGEX !!!!!! *GRRR*
}
close(FH);
}

So, nun hab ich das. Aber wie bekomm ich die /etc/passwd auch ausgetauscht?!?!

print FH ($tmp1 = $_) =~ s/\/bin\/(.*)/\/bin\/false/m; # I HATE REGEX !!!!!! *GRRR*

Haut die ganze passwd weg. Welche MODE brauch ich dafuer?!

// edit: +< scheints zu sein. dann is mein regex falsch oO obwohl das doch so impel is oO

// edit2: also langsam hab ich keine Lust mehr. Wie kann ich denn /bin/bash in /bin/false tauschen? So schwer kann das doch nicht sein. Aber er macht es einfach nicht\n\n

<!--EDIT|RPerl|1185621464-->
Linuxer
 2007-07-28 15:21
#79023 #79023
User since
2006-01-27
3881 Artikel
HausmeisterIn

user image
[quote=RPerl,28.07.2007, 12:58]klar, klar. aber da funktioniert nicht mit subfunktionen.
Ich kann nicht einfach

Code (perl): (dl )
if ( $change ) {


machen. Weil ich kein $change habe sondern &change. Also eine Subfunktion
[/quote]
Und? Ich erkenne Dein Problem nicht.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/perl
# vi:ts=4 sw=4 et:
use strict;
use warnings;
use Getopt::Long;

# http://board.perl-community.de/cgi-bin/ikonboard/ikonboard.cgi?act=ST;f=6;t=4491

#> global variables
#> ----------------------------------------------------------------------------

my $change = 0;

#> main script
#> ----------------------------------------------------------------------------

if ( !@ARGV ) {
    die "you didn't mention any options. see help for more.\n";
}
else {
    my $result = GetOptions( "change" => \&change );
}



sub change {
    print "wanna change?", $/;
}

__END__


[quote=RPerl,28.07.2007, 12:58]Naechstes Problem: Ich mach das jetzt nicht direkt in 'n neuen Thread. Aber kann perl keine Dateien "tauschen"?

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
sub lock {
open(FH,"+>/etc/passwd");
while (<FH>) {
    my $tmp1 = $_;
    #($tmp1 = $_) =~ s/bin\/bash/\/bin\/false/m;
     ($tmp1 = $_)  =~ s/\/bin\/(.*)/\/bin\/false/m;        # I HATE REGEX !!!!!! *GRRR*
}
close(FH);
}

So, nun hab ich das. Aber wie bekomm ich die /etc/passwd auch ausgetauscht?!?!

print FH ($tmp1 = $_) =~ s/\/bin\/(.*)/\/bin\/false/m; # I HATE REGEX !!!!!! *GRRR*

Haut die ganze passwd weg. Welche MODE brauch ich dafuer?!

// edit: +< scheints zu sein. dann is mein regex falsch oO obwohl das doch so impel is oO[/quote]

Was meinst Du damit? Dateisystemoperationen sind beispielsweise mit File::Copy möglich. Was soll Perl tun, wenn Du "Dateien tauschen" meinst? Auch hier erkenne ich Dein Problem nicht.

Ausserdem krieg ich Gänsehaut, wenn ich das sehe ;o)
Niemals die /etc/passwd im original bearbeiten. lege eine Kopie an und editiere diese; danach kannst Du die /etc/paswd mit der Kopie überschreiben.

Z.B.
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/perl
# vi:ts=4 sw=4 et:
use strict;
use warnings;

my $file = '/etc/passwd';

open my $infh, $file or die "$file: $!\n";
my @passwd = <$infh>;
close $infh or die "$file: $!\n";

for my $i ( 0 .. $#passwd ) {
    
    $passwd[$i] =~ s{/bin/(.+)$}{/bin/false};

    print $passwd[$i];

}

# BACKUP /etc/passwd; THEN something like
open my $outfh, '>', $file or die "$file: $!\n";

print $outfh @passwd or die "$file: $!\n";
close $outfh or die "$file: $!\n";

__END__


Wenn Du nur die LoginShell des Benutzers ändern willst, dann nutze doch das Shell - Kommando /usr/bin/chsh.

EDIT:Hm, chsh trägt nur jene Shells ein, die in /etc/shells definiert sind. Wenn dort /bin/false nicht enthalten ist, wird das wohl nicht klappen.\n\n

<!--EDIT|Linuxer|1185622093-->
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
renee
 2007-07-28 15:24
#79024 #79024
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=RPerl,28.07.2007, 12:58]klar, klar. aber da funktioniert nicht mit subfunktionen.
Ich kann nicht einfach

Code (perl): (dl )
if ( $change ) {


machen. Weil ich kein $change habe sondern &change. Also eine Subfunktion

[/quote]

Ich kapier' noch nicht, was Du eigentlich machen willst...

Quote

Naechstes Problem: Ich mach das jetzt nicht direkt in 'n neuen Thread. Aber kann perl keine Dateien "tauschen"?

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
sub lock {
open(FH,"+>/etc/passwd");
while (<FH>) {
    my $tmp1 = $_;
    #($tmp1 = $_) =~ s/bin\/bash/\/bin\/false/m;
     ($tmp1 = $_)  =~ s/\/bin\/(.*)/\/bin\/false/m;        # I HATE REGEX !!!!!! *GRRR*
}
close(FH);
}

So, nun hab ich das. Aber wie bekomm ich die /etc/passwd auch ausgetauscht?!?!

print FH ($tmp1 = $_) =~ s/\/bin\/(.*)/\/bin\/false/m; # I HATE REGEX !!!!!! *GRRR*

Haut die ganze passwd weg. Welche MODE brauch ich dafuer?!

// edit: +< scheints zu sein. dann is mein regex falsch oO obwohl das doch so impel is oO

// edit2: also langsam hab ich keine Lust mehr. Wie kann ich denn /bin/bash in /bin/false tauschen? So schwer kann das doch nicht sein. Aber er macht es einfach nicht

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl

use strict;
use warnings;
use Tie::File;

my $file = '/etc/passwd';

tie my @lines, 'Tie::File', $file or die $!;
for my $line ( @lines ){
    $line =~ s~/bin/bash~/bin/false~;
}
untie @lines;
\n\n

<!--EDIT|renee|1185621887-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 >| >> 20 Einträge, 2 Seiten



View all threads created 2007-07-28 12:44.