小编kob*_*ame的帖子

使用sudo运行延迟命令

想以root身份运行bash脚本但是延迟了.怎么能实现这个?

sudo "sleep 3600; command" , or
sudo (sleep 3600; command)
Run Code Online (Sandbox Code Playgroud)

不起作用.

bash sudo gnu-coreutils

7
推荐指数
1
解决办法
5139
查看次数

如何设置由Plack :: Middleware :: Session管理的cookie的到期时间?

现在我的app.psgi包含(简化):

builder {
      enable 'Session', store => 'File'; #default uses Plack::Session::State::Cookie
      $app;
};
Run Code Online (Sandbox Code Playgroud)

后来,$app我正在使用:

my $req = Plack::Request->new($env);
my $session = $req->session(); #returns env->{'psgix.session'}
$session->{user} = "name";
Run Code Online (Sandbox Code Playgroud)

它工作正常,例如:

现在,我希望在登录面板中实现"记住我"功能.在这种情况下,不应从浏览器中自动删除sesion-state-cookie.这可以通过使用Plack :: Session :: State :: Cookie中expires方法来完成.

问题:

如何从我的更改cookie过期(由Session中间件管理)$app.换句话说,如何在这里调用expire方法:

my $req = Plack::Request->new($env);
my $session = $req->session(); #returns env->{'psgix.session'}
$session->{user} = "name"; …
Run Code Online (Sandbox Code Playgroud)

perl session middleware session-cookies plack

7
推荐指数
1
解决办法
718
查看次数

谁对http:// 0:port错了?

Plack套件通常使用http://0:port.例如以下内容

plackup -MPlack::App::Directory -e 'Plack::App::Directory->new(root=>".");'
Run Code Online (Sandbox Code Playgroud)

版画

HTTP::Server::PSGI: Accepting connections at http://0:5000/
Run Code Online (Sandbox Code Playgroud)

但是,LWP::UserAgent(或一些更深层次的模块)不接受它,例如:

perl -MLWP::UserAgent -E '$u=LWP::UserAgent->new;$res=$u->get("http://0:5000/valid/path");print $res->status_line'
Run Code Online (Sandbox Code Playgroud)

打印:

500 No Host option provided
Run Code Online (Sandbox Code Playgroud)

但是

perl -MLWP::UserAgent -E '$u=LWP::UserAgent->new;$res=$u->get("http://localhost:5000/valid/path");print $res->status_line'
Run Code Online (Sandbox Code Playgroud)

版画

200 OK
Run Code Online (Sandbox Code Playgroud)

问题是:谁错了?

  • http://0:port有效的,例如LWP是"错误的"
  • 或者它无效,PSGI仅将其用作"随机有效"的快捷方式?

perl lwp psgi

7
推荐指数
1
解决办法
320
查看次数

覆盖perl中的"eval"

有以下内容:

use 5.014;
use warnings;
BEGIN {
    use subs qw(int);
    sub int {
        print STDERR "\tthe int got: $_[0]\n";
        my $res =  CORE::int($_[0]);
        print STDERR "\tCORE::int: $res\n";
        return $res;
    }
}

my $x;
$x = 1.1 ; say "result of int($x) is: ", int($x);
$x = 6.6 ; say "result of int($x) is: ", int($x);
Run Code Online (Sandbox Code Playgroud)

它打印

    the int got: 1.1
    CORE::int: 1
result of int(1.1) is: 1
    the int got: 6.6
    CORE::int: 6
result of int(6.6) is: 6
Run Code Online (Sandbox Code Playgroud)

int …

perl

7
推荐指数
1
解决办法
211
查看次数

Perl:解释如何使用"uni :: perl"模块 - 加载编译指示和其他模块

在我以前的问题中,我问过如何使用多个模块.得到了一个完美的答案,另一个指向Modern :: Perl模块的东西真的很简单.

经过一点点搜索CPAN后,我找到了另一个名为uni :: perl的模块,这真的很复杂 - 它等同于:

use strict;
use feature qw(say state switch);
no warnings;
use warnings qw(FATAL closed threads internal debugging pack substr malloc
                unopened portable prototype inplace io pipe unpack regexp
                deprecated exiting glob digit printf utf8 layer
                reserved parenthesis taint closure semicolon);
no warnings qw(exec newline);
use utf8;
use open (:utf8 :std);
use mro 'c3';
Run Code Online (Sandbox Code Playgroud)

有人可以解释/评论它是如何工作的吗?

我将整个代码粘贴到几个部分,并将我的问题添加到(with ###)中.

我明白这个问题真的很长.但是,将它分成更小的一个将无济于事,因为整体是关于"uni :: perl"模块.

请帮助我理解有问题的部分.


package uni::perl; …
Run Code Online (Sandbox Code Playgroud)

perl

6
推荐指数
1
解决办法
349
查看次数

将我自己的pragma添加到旧perl sw的正确方法

我有一个非常古老的perl系统(大约8-10岁),但是一个大的(100+ pm文件).现在由于某种原因需要"重新现代化"它 - 一步一步.

我想要完成的第一件事就是在每个模块中插入我的pragma:

use MySw::PerlDefs;
Run Code Online (Sandbox Code Playgroud)

什么将包含像Modern :: Perl和/或在这个问题中的东西:如何使用现代perl和utf8默认值"使用My :: defaults"?

QST1:推荐的方式是什么?

  1. 添加use MySw::PerlDefs;就会得到

    package MySw::SomePackage;
    use MySw::PerlDefs;         #my new "pragma"
    

  2. 或者在包声明后添加包含在BEGIN块中的PerlDefs?例如:

     package MySw::SomePackage;
     BEGIN {use MySw::PerlDefs;}  #my new "pragma" in the BEGIN block
    

问题:

  • 什么是首选方法?
  • 有什么区别和/或缺点?

Ps:我理解比在编译时出现的BEGIN,但在上面的上下文中 - 它并不比"简单使用"更好?

perl

6
推荐指数
1
解决办法
133
查看次数

将Modperl配置转换为Plack - 通过文件扩展名运行不同的处理程序

我正在尝试将我当前的Apache/Modperl站点转移到Starman,并且需要使用不同的处理程序构建app.psgi以用于不同的文件扩展名.像Apache一样的东西:

<LocationMatch "(\.m|\.mh|\/)$">
     SetHandler              perl-script
     PerlHandler             MyApp::Mhandler
</LocationMatch>

<LocationMatch "(\.p|\.ph)$">
     SetHandler              perl-script
     PerlHandler             MyApp::Phandler
</LocationMatch>
Run Code Online (Sandbox Code Playgroud)

我现在有:

#app for handle .m and .mh
my $Mapp = Some::PSGI->handler( sub {
...
});

#app for handling .p and .ph
my $Papp = SomeOther::PSGI->handler( sub {
...
});
Run Code Online (Sandbox Code Playgroud)

但如何使用建设者?

builder {

    #any extension what is not .m .mh .p .ph - handle as static
    #but, only when the request have any extension
    enable "Plack::Middleware::Static",
      path => __what here__, ???
      root => "/my/doc/root";

    #and what …
Run Code Online (Sandbox Code Playgroud)

perl plack

6
推荐指数
1
解决办法
452
查看次数

使用Apache反向代理处理plack/PSGI应用程序的身份验证

这是我的情景:

Apache的反向代理接龙

所以,

  1. 通过加密HTTPS的请求转到Apache,如: https://server1/MyPerlApp
  2. 如果用户未登录,则会重定向到某个登录页面(在server1中),并且Apache不会将请求代理到Server2
  3. 当登录的用户-被验证-再阿帕奇转发所有的请求被即将https://server1/MyPerlApphttp://server2:5000

问题1:这可能吗?(问,因为我不太了解Apache,这不是一个简单的:

ProxyPass /MyPerlApp http://server2:5000/
Run Code Online (Sandbox Code Playgroud)

因为我需要在server1上验证用户身份,并ProxyPass在验证时设置Only.由于Apache非常灵活,我认为上面的答案是肯定的(但确认和细节非常受欢迎) - 所以这是我的主要具体问题:

  • 我的Plack应用程序将如何知道Apache级别(第一台服务器)上的用户身份验证?
  • 什么是将一些用户信息提供给perl服务器2上的应用程序的简单方法?例如,使用Apache 为每个查询mod_rewrite附加一个user=username参数,
  • Apache可以设置我的perl应用应该读取的一些HTTP标头吗?
  • 有一种简单而又重新开始的方式吗?

我正在寻找如何避免我的starman/perl应用程序中的身份验证例程,因为:

  • 用户无论如何都需要登录到server1(对于他工作流程中的其他任务)
  • 如果他已经登录,则不需要在我的应用程序中进行身份验证(避免不必要的双重登录)
  • 但是我仍然需要知道哪些用户已登录(通过server1上的Apache)

已经有类似的问题,但是:

apache perl reverse-proxy plack psgi

6
推荐指数
1
解决办法
4352
查看次数

管道vs重定向到进程

寻找一些bash专家的解释.下一个之间的确切区别是什么

command1 | command2
Run Code Online (Sandbox Code Playgroud)

例如,经典管道,其中command1的stdout被重定向到command2的stdin,例如

  • bash自己两次问
  • 更改文件描述符
  • 执行comman1和command2

command1 > >(command2)
Run Code Online (Sandbox Code Playgroud)

结果(和bash动作)是一样的......

至少我得到了相同的

find . -print0 | xargs -0 -n1 -I% echo =%=
Run Code Online (Sandbox Code Playgroud)

find . -print0 > >(xargs -0 -n1 -I% echo =%=)
Run Code Online (Sandbox Code Playgroud)

> >(command)唯一更长的说法|吗?或者不是,我错过了什么?

bash

6
推荐指数
2
解决办法
450
查看次数

Vim相当于"tr"命令

有这样的线:

xxAyayyBwedCdweDmdwCkDwedBAwe
;;;; cleaner example
__A__B__C__D__C_D_BA_
Run Code Online (Sandbox Code Playgroud)

想要替换ABCDPQRT例如得到

__P__Q__R__T__R_T_QP_
Run Code Online (Sandbox Code Playgroud)

例如,下一个bash或perl的等价 tr

tr '[ABCD]' '[PQRT]' <<<"$string"
Run Code Online (Sandbox Code Playgroud)

如何在"vim"中执行此操作?(VIM - Vi IMproved 7.4(2013年8月10日,2014年5月9日编译12:12:40))

vim

6
推荐指数
1
解决办法
2168
查看次数