GVKun编程网logo

.net应用程序在Linux上运行吗?(.net程序部署到linux)

18

对于想了解.net应用程序在Linux上运行吗?的读者,本文将是一篇不可错过的文章,我们将详细介绍.net程序部署到linux,并且为您提供关于Asp.netCore应用程序在Linux上部署的图文详

对于想了解.net应用程序在Linux上运行吗?的读者,本文将是一篇不可错过的文章,我们将详细介绍.net程序部署到linux,并且为您提供关于Asp.net Core应用程序在Linux上部署的图文详解、c – 在Linux上为Qt应用程序获取root访问权的正确方法、c – 多个WT应用程序可以在同一端口上运行吗?、c# – 任何ASP.net应用程序(或大多数)可以使用Mono在Linux下运行吗?的有价值信息。

本文目录一览:

.net应用程序在Linux上运行吗?(.net程序部署到linux)

.net应用程序在Linux上运行吗?(.net程序部署到linux)

.net应用程序在 linux上运行吗?

有没有免费/付费的互操作库?

解决方法

Mono是.NET兼容的平台,包括编译器和运行时. Mono Migration Analyzer有助于找出兼容性问题.

Asp.net Core应用程序在Linux上部署的图文详解

Asp.net Core应用程序在Linux上部署的图文详解

快两个月没接触.net,倒是天天在用Linux,所以想尝试一下在Linux运行喜欢的.net 应用。

  • 安装CentOS

  • 安装.Net core for Linux

  • 创建Asp.net Core应用程序

  • 安装Nginx

  • 配置Nginx代理

1,安装CentOS系统

这个网上教程太多滤过。

image

2,安装跨平台的.NET Core SDK for CentOS7

  • sudo yum update

  • sudo yum install libunwind libicu

  • sudo yum install dotnet-sdk-2.0.0

image

dotnet --info可以确认是否安装成功

image

3,创建Asp.net Core应用程序

dotnet new web

image

由于需要虚拟机外部访问得修改默认的localhost设置:

vi Program.cs

添加UseUrls(“http://*:5000”)

image

发布并测试

dotnet publish –c release

dotnet TestAspnetCore.dll

image

重点:设置防火墙

sudo firewall-cmd --permanent --zone=public --add-service=http 
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --permanent --zone=public --add-port=5000/tcp
sudo firewall-cmd --reload

image

虚拟机外部访问确认

image

image

4,安装Nginx

sudo yum install epel-release

sudo yum install Nginx

Nginx –v 查看版本

image

查找Linux的IP地址,启动Nginx服务

image

虚拟机外部访问地址

备注:如果无法显示这个页面估计是防火墙没有设置。

image

5,配置Nginx代理

image

Nginx详细设置待续

c – 在Linux上为Qt应用程序获取root访问权的正确方法

c – 在Linux上为Qt应用程序获取root访问权的正确方法

美好的一天

背景:

我正在为Linux系统创建一个OpenVPN包装器应用程序,该应用程序即将完成.我遇到了一些障碍.

OpenVPN需要root访问权来修改路由表(添加和删除路由).这是事情变得模糊和混乱的地方.

希望通过扩展this question,可以共享一些行业标准答案和解决方案.

文档:

因此,经过几个小时的搜索,我编制了一个获取root访问权限的可能方法列表,但是似乎没有一个是官方的,也没有任何真正可靠的指导来获得这个SU特权.

让我们考虑以下方法.

1.使用pkexec& polkits

有关最佳做法的一些信息,请查找官方freedesktop polkit documentation here和here

使用pkexec和polkits在线发现了一些教程
  – here,这帮我创建了我的polkit文件.
  – SO Thread
  – 用于Qt应用程序的lovely small tutorial

关于pkexec和polkits的简要解释(我的理解):

> polkits:

polkits由行动和规则组成(参见深入阅读和解释的文件).它定义了应用程序的操作以及与之关联的规则.规则可以定义为属于特定组的用户,其中操作查询规则,成功传递规则,用户自动进行身份验证(没有弹出密码提示),否则他们需要输入管理员密码

> pkexec:

用于与polkit操作进行交互并对应用程序进行身份验证以获取root访问权限的应用程序.

这些需要在/usr/share / polkit-1 / actions /和/usr/share/polkit-1/rules.d/中添加操作(在其他目录中,请参阅所有位置的文档)

这种方法似乎很好用(但需要更多的解释才能轻松理解,imo)

注意:有qt-polkit库可供使用,请参阅他们的github repository

对于简单的TL; DR版本,请参阅this

我创建的polkit文件(注意这可能不正确,但它对我有用):

可以找到/添加的位置(还有其他位置)

/usr/share/polkit-1/actions

Policy Kit文件名:
    com.myappname.something.policy //需要.policy

注意:

com.myappname.something

被称为政策的命名空间(阅读文档,这将不清楚)

政策套件内容

vendor>
  <vendor_url>http://myappurl.com/vendor_url>

  

关于我的政策文件的注释(重要的位)

>这只是一个示例,请参阅官方示例和说明的文档:
>< vendor>我的应用名称< / vendor>是应用程序名称,它可以有空格
>< action id =“com.myappname.something.myaction-name”>这里有任何动作名称.
>注意!
文件名 – > com.myappname.something.policy和,
动作ID – > com.myappname.something.myaction-name应该具有相同的命名空间
>图标名称应与最新的freedesktop图标规格here一致

TL; DR(或不想):
图标位置是:

 1. /home/yourusername/.icons (sometimes not there)
 2. /home/yourusername/.local/share/icons
 2. /usr/share/icons

只要它们符合大小并且是.png,您只能传递文件名(省略格式)

>非常重要:

当调用pkexec< myappname>,并且没有这些行时(老实说,我不太确定它们的用途),会遇到类似这样的错误:

2017-12-19 12::58:24 Fatal: QXcbConnection: Could not connect to display  ((null):0,(null))

Aborted (core dumped)

注意:保持密钥相同,但是您可以并且可能应该将exec.path密钥更改为您的应用程序位置.

政策工具包如何运作?

简而言之,如果你回顾前面提到的可爱的example(并跳过所有非常相似的文件名),它就变得清晰了.

当一个人跑:

pkexec 

这会调用本地身份验证代理以root身份运行应用程序(在我们的示例中).

这由动作(上面提到的策略工具包)处理.此外,规则利用动作id来执行附加查询等,这些可以在上面提供的示例中查看.

输入管理员密码后,根据输入默认值的“设置”(参见here),我们有:

auth_admin_keep

Like auth_admin but the authorization is kept for a brief period (e.g. five minutes).

因此,用户可以(在我的OpenVPN应用程序中)在接下来的5分钟内连接到OpenVPN连接,直到再次请求密码.

2. Sudo(/ etc / sudoers):

这似乎是大多数需要root访问权限的用户的方法,但不建议:

例如通过使用参数调用singleShot QProcess,在运行主应用程序之前检查root访问权限:

/bin/sh -c sudo -v

将导致各种Linux发行版中的退出代码为1(从而导致我搜索备选方案)

3. setuid():

一个非常好的example可以在这里找到,不幸的是它似乎不适用于现代Linux发行版,因为它是一个很容易被利用的安全漏洞.

简而言之,该过程需要一个:

chmod +x 

并使用getuid()检查是否在应用程序中设置了s位以获取用户ID,并使用getgid()获取用户的组ID.

这些函数可以在以下定义的Linux头文件中找到:

nes structs
nes methods

但是,这似乎不适用于现代Linux系统.以下是执行s位设置的root拥有的应用程序的输出,作为普通(非特权)用户运行:

2017-12-19 12::21:08 Fatal: FATAL: The application binary appears to be running setuid,this is a security hole. ((null):0,(null))

Aborted (core dumped)

告别,setuid()

4.其他方法:

> PAM

进一步阅读,见

> man page
> tutorial/explanation
>关于跨平台PAM整合的QT Forum问题

> QT用户模式
Qt提供了small implementation for acquiring root access,但它仅适用于使用yum包管理器的Linux发行版.

关于此问题的后续问题,见this QT Forum question

问题:

上面可能只包括一小部分可用的方法来获取root访问权限,但考虑到某些应用程序是全局使用的,它们经常被攻击或撬开甚至受到攻击.

在做了这项研究之后,它扩大了我的知识,但没有给我一个推荐的确定方法,但只提示.

题:

上面哪种方法在工业上是首选的,即何时我应该使用另一种方法(PAM vs polkits vs simple sudo),如果有其他方法可用,这些是首选吗?

最佳答案

However,this does not seem to work with modern day Linux systems.
Here is the output of executing a root owned application with the s
bit set,run as a normal (unprivileged) user:

2017-12-19 12::21:08 Fatal: FATAL: The application binary appears to be running setuid,(null))

上述错误与现代Linux系统无关.它是对使用setuid而不理解它的愚蠢开发人员的Qt保护.

只需致电

QCoreApplication::setSetuidAllowed(true)

当你的应用程序启动时,你可以做setuid()就好了.您甚至可以在下载到“普通”用户之前运行特权命令.

摘要:

您的Qt应用程序必须具有root所有者,并且setuid位设置.示例debmaker是我想要执行特权操作的Qt应用程序.所以在我建立debmaker之后,我做了:

sudo chown root:root debmaker
sudo chmod 4755 debmaker

(后者设置setuid位)

现在运行Qt应用程序

./debmaker

应用程序做的第一件事是检查geteuid()== 0和getuid()== 1000(1000是我的用户ID,0是根)

然后它启动一个新进程(在Qt中使用QProcess).这将以特权模式运行. (示例我的子进程称为chroot)

现在通过调用将主应用程序(我的debmaker)放到正常的用户级别

setuid(getuid());

chroot(子进程)将继续以root用户身份运行.

主应用程序现在不再以提升模式运行,但可以将请求发送到仍在提升模式下运行的子进程.

QProcess *chroot = new QProcess;
blah blah setup the chroot and start it
chroot->write("chown root:root /home/oosman/foo");

最后一行将向子进程发送消息.您在子进程中读取stdin,解析命令,检查它以确保它不是恶意的(或恶意取决于您的意图!)并执行命令.

c – 多个WT应用程序可以在同一端口上运行吗?

c – 多个WT应用程序可以在同一端口上运行吗?

更新1:我最近发现WT使用TCP(HTTP)进行通信,如果这有助于任何人.

标题说明了一遍,是否可以在同一个端口上运行2个不同的WT应用程序或项目?我知道WT已经通过其启动参数来控制应用程序的托管方式,如下所示.我正在使用Visual Studio 2010,并在debugging->命令参数框中输入以下参数,如下所示:

--http-address=0.0.0.0 --http-port=8080 --deploy-path=/hello --docroot=.

以上参数将要求用户打开网页

http://127.0.0.1:8080/hello

所以,不过,如果我主持另一个具有以下参数的项目,那该怎么办?

--http-address=0.0.0.0 --http-port=8080 --deploy-path=/world --docroot=.

所以我需要连接到

http://127.0.0.1:8080/world

上面实际上不起作用,它只承载连接的第一个应用程序,第二个应用程序在第一个关闭之前不会连接.所以这就把我带到了这里.有没有其他方法可以在同一个端口上运行多个WT应用程序?

预先感谢您的任何帮助!

解决方法

是的,您可以实现这一目标,但您需要创建自己的WRun并使用addEntryPoint.这实际上是在 tutorial中提到的,如下所示:

Inside WRun()

WRun() is actually a convenience function which creates and configures a WServer instance. If you want more control,for example if you have multiple “entry points”,or want to control the server starting and stopping,you can use the WServer API directly instead.

这里有一个示例,两个应用程序都是Hello World应用程序,但请注意它们在按钮上有不同的标题和不同的消息,当您按下它们时.你可以在src / http / Serve.C和src / Wt / WServer上找到另一个WRun实现.

two_helloworlds.cc

#include <Wt/WApplication>
#include <Wt/WBreak>
#include <Wt/WContainerWidget>
#include <Wt/WLineEdit>
#include <Wt/WPushButton>
#include <Wt/WText>
#include <Wt/WException>
#include <Wt/WLogger>
#include <Wt/WServer>

class HelloApplication : public Wt::WApplication
{
public:
    HelloApplication(const Wt::WEnvironment& env,const std::string& title);

private:
    Wt::WLineEdit *nameEdit_;
    Wt::WText *greeting_;

    void greet();
};

HelloApplication::HelloApplication(const Wt::WEnvironment& env,const std::string& title)
    : Wt::WApplication(env)
{
    setTitle(title);

    root()->addWidget(new Wt::WText("Your name,please ? "));
    nameEdit_ = new Wt::WLineEdit(root());
    Wt::WPushButton *button = new Wt::WPushButton("Greet me.",root());
    root()->addWidget(new Wt::WBreak());
    greeting_ = new Wt::WText(root());
    button->clicked().connect(this,&HelloApplication::greet);
}

void HelloApplication::greet()
{    greeting_->setText("Hello there," + nameEdit_->text());
}
class GoodbyeApplication : public Wt::WApplication{
public:
    GoodbyeApplication(const Wt::WEnvironment& env,const std::string& title);

private:    Wt::WLineEdit *nameEdit_;
    Wt::WText *greeting_;


    void greet();
};

GoodbyeApplication::GoodbyeApplication(const Wt::WEnvironment& env,please ? "));
    nameEdit_ = new Wt::WLineEdit(root());
    Wt::WPushButton *button = new Wt::WPushButton("Say goodbye.",&GoodbyeApplication::greet);
}

void GoodbyeApplication::greet()
{
    greeting_->setText("Goodbye," + nameEdit_->text());
}

Wt::WApplication *createApplication(const Wt::WEnvironment& env)
{
    return new HelloApplication(env,"First app");
}

Wt::WApplication *createSecondApplication(const Wt::WEnvironment& env)
{
    return new GoodbyeApplication(env,"Second app");
}

int YourWRun(int argc,char *argv[],Wt::ApplicationCreator createApplication,Wt::ApplicationCreator createSecondApplication)
{
  try {
    // use argv[0] as the application name to match a suitable entry
    // in the Wt configuration file,and use the default configuration
    // file (which defaults to /etc/wt/wt_config.xml unless the environment
    // variable WT_CONfig_XML is set)
    Wt::WServer server(argv[0],"");

    // WTHTTP_CONfigURATION is e.g. "/etc/wt/wthttpd"
    server.setServerConfiguration(argc,argv,WTHTTP_CONfigURATION);

    // add a single entry point,at the default location (as determined
    // by the server configuration's deploy-path)
    server.addEntryPoint(Wt::Application,createApplication);
    server.addEntryPoint(Wt::Application,createSecondApplication,"/second");
    if (server.start()) {
      int sig = Wt::WServer::waitForShutdown(argv[0]);

      std::cerr << "Shutdown (signal = " << sig << ")" << std::endl;
      server.stop();

      /*
      if (sig == SIGHUP)
        WServer::restart(argc,environ);
      */
      }
  } catch (Wt::WServer::Exception& e) {
    std::cerr << e.what() << "\n";
    return 1;
  } catch (std::exception& e) {
    std::cerr << "exception: " << e.what() << "\n";
    return 1;
  }
}

int main(int argc,char **argv)
{
    return YourWRun(argc,&createApplication,&createSecondApplication);
}

用它编译

g -g -o two_helloworlds two_helloworlds.cc -I /usr/local/include -L /usr/local/lib -lwthttp -lwt -lboost_random -lboost_regex -lboost_signals -lboost_system -lboost_thread -lboost_filesystem -lboost_program_options -lboost_date_time

并执行

./two_helloworlds –docroot. –http-address 0.0.0.0 –http-port 8080

在localhost:8080上你将访问其中一个应用程序和localhost:8080 /秒你将访问另一个.

c# – 任何ASP.net应用程序(或大多数)可以使用Mono在Linux下运行吗?

c# – 任何ASP.net应用程序(或大多数)可以使用Mono在Linux下运行吗?

换句话说,既然我们拥有Mono,那么当涉及到服务器端Web应用程序时,C#是否与 Java无关?或者,对于Mono能够/不能做什么,或者可以在 Linux上为C#服务器端应用程序提供哪些库,还有很大的局限性?

解决方法

“可以运行任何(或大部分)ASP.NET应用程序”的答案是“是”.有一个页面有一些常见的陷阱: Mono: Porting ASP.NET Applications(也感兴趣 Porting WinForms applications page)

我在现场[1]中看到的最常见问题是,按发生次数:

>不了解区分大小写的文件系统或不关心文件/路径处理的代码.这些都需要工作.
> P / Invokes:Windows本机函数有很多P / Invokes. Mono中不支持它们中的大多数(在unix环境中它们也没有意义).但是,我们有一些或最常见的映射(CloseHandle等).这些需要使用.NET API重做相同的东西.
>错误:不管你相信与否,3M代码行中仍然存在漏洞.我们尽可能快速响应并修复错误(我们希望做更多的事情,在24小时轮换期间归咎于它).重现问题的测试用例越简单,修复得越快.提交错误报告,我们会尽快修复它.
>缺少或未实现的API:我们仍然拥有这些并尝试专注于最常用的API.有时我们会使用Moma报告(请参阅下面的链接)来确定优先顺序.

请查看Moma Reports page,其中包含有关已运行Moma的应用程序的用户提交的数据.

[1]:该领域的范围从西半球最大的ASP.NET部署之一到小型开源应用程序.

我们今天的关于.net应用程序在Linux上运行吗?.net程序部署到linux的分享已经告一段落,感谢您的关注,如果您想了解更多关于Asp.net Core应用程序在Linux上部署的图文详解、c – 在Linux上为Qt应用程序获取root访问权的正确方法、c – 多个WT应用程序可以在同一端口上运行吗?、c# – 任何ASP.net应用程序(或大多数)可以使用Mono在Linux下运行吗?的相关信息,请在本站查询。

本文标签: