十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
#1:runuser命令runuser命令使用一个替代的用户或者组ID运行一个Shell。这个命令仅在root用户时有用。仅以会话PAM钩子运行,并且没有密码提示。如果用一个非root用户,并且该用户没有权限设置user ID,这个命令将会因为程序没有setuid而失败。因runuser不会运行认证和账户PAM钩子,它比su更底层。语法:代码如下:runuser -l userNameHere -c 'command'runuser -l userNameHere -c '/path/to/command arg1 arg2'举例来说,作为一个root用户,你也许想检查下oracle用户下的shell资源限制,输入:代码如下:# runuser -l oracle -c 'ulimit -SHa'或者监察下nginx或lighttpd web服务器限制:代码如下:# runuser -l nginx -c 'ulimit -SHa'或代码如下:# runuser -l lighttpd -c 'ulimit -SHa'有时,root用户由于权限(安全)问题不能浏览NFS挂载的共享:代码如下:# ls -l /nfs/wwwroot/cyberciti.biz/http或代码如下:# cd /nfs/wwwroot/cyberciti.biz/http可能的输出:代码如下:-bash: cd: /nfs/wwwroot/cyberciti.biz/http/: Permission denied尽管如此,apache用户被允许浏览或访问挂载在/nfs/wwwroot/cyberciti.biz/http/下基于nfs的系统:代码如下:# runuser -l apache -c 'ls -l /nfs/wwwroot/cyberciti.biz/http/'或代码如下:# runuser -l apache -c 'cd /nfs/wwwroot/cyberciti.biz/http/; vi index.php'使用runuser命令,无需使用密码,并且,只能在root用户下使用。可用选项:-l: 让shell成为登录shell,用 runuser -l PAM 文件替代默认的-g:指定主要的组-G 追加组-c:命令,要传到shell的单个命令--session-command=COMMAND:使用-c传递单个命令道shell中并且不创建新的会话-m: 不重置环境变量。#2:su命令su命令允许你成为一个超级用户或者替代用户(substitute user),欺骗用户(spoof user),设置用户(set user)或者切换用户(switch user)。它允许一个Linxu用户切换当前用户到那些你知道密码的目标用户,切换包括与之关联的运行中的控制台(console)或者Shell,它的语法如下:代码如下:su -su - username切换到root用户su命令会询问目标用户的密码,在你的shell命令行中输入 su - 来切换到root用户(你必须知道root用户的密码):代码如下:vivek@wks01:~$ su -或代码如下:vivek@wks01:~$ su - root输出示例:Password:代码如下:root@wks01:/root# logoutvivek@wks01:~$如果输入了正确的root密码,会话的所有权(这里应该指当前控制台的上下文——译注)将改为root账户。输入logout可以退出一个root登录的shell,输入 whoami或者id命令来验证当前会话的所有者:whoami或id用root账户运行命令语法是:代码如下:su - root -c "command"或代码如下:su - -c "command arg1"查看/root目录下的内容,这些原本是普通用户无法访问的,运行:代码如下:su - root -c "ls -l /root"需要注意的是,Linix和一些Unix-like系统有一个wheel用户组,并且只允许这个组内的用户使用su切换到root。使用su命令来让其他用户运行命令下面这个命令是切换到oracle的账户,并且显示限制清单:代码如下:$ su - oracle -c 'ulimit -aHS'同样, 如果提供了正确的oracle密码,会话所有权将会变成oracle账户。su命令的日志保存在系统日志中,一般是在/var/log/auth.log(Debian/Ubuntu)或者/var/log/secure(RHEL/CentOS)。#3: sudo命令sudo以另外的用户来执行一个命令,但是它跟着一组关于那些用户可以以那些其他用户执行那些命令的规则(有点绕口——译注)。这个规则在/etc/sudoers这个文件中被定义。不像su,sudo验证用户是靠用户自己的密码而不是那个要切换的用户密码。当提供一个审计跟踪命令和他们的参数时(原文:...whileproviding an audit trail of the commands and their arguments——译注)sudo允许一个系统管理员给某些用户(或用户组)委派以root或其他用户来运行某些(或全部)命令的权限。这允许无需在用户之间共享密码就可以在指定宿主上将指定命令委派给指定用户。语法如下:代码如下:sudo commandGUI工具注意事项(su和sudo的前端GUI)gksu 命令是su的前台,gksudo 是sudo的前端。他们的主要用途是用来运行需要root权限但不需要运行一个X terminal emulator和使用直接使用su的图形化命令。语法如下:代码如下:gksu [-u ] [options] gksudo [-u ] [options] 仅输入gksu,将会显示下面这个弹窗:然后,你将会被要求输入root用户的密码:你也可以直接运行下面代码:代码如下:gksu -u root 'ls /root'或,以oracle用户运行命令:代码如下:gksu -u oracle 'ulimit -aHS'或作为root登录:代码如下:gksu -u root -l总结:runuser VS su VS sudo
创新互联建站专注于申扎网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供申扎营销型网站建设,申扎网站制作、申扎网页设计、申扎网站官网定制、重庆小程序开发服务,打造申扎网络公司原创品牌,更为您提供申扎网站排名全网营销落地服务。
没有,你可以考虑动态加载库文件.
至少我没有在linux下这样用过,在那下面用的动态加载.
也可以静态加载.
但是#pregma comment(lib,WNLIB) 明显是MFC加载库的最简单方法么.
总共又三种方案:mingw+codeblocks,是windows下的gcc编译工具+跨的轻量ide,可以编译c++的程序,还可以使用wxWidget(跨的界面工具)
使用cygwin,是windows下中间件级别的编译工具。可以在cygwin下用命令行编译程序。
使用vmware或者其他虚拟机,安装目标linux系统,并且编译。这是虚拟硬件级别的编译工具,其编译的程序是完全可以在linux系统上运行的。
由于都是默认bash,shell,那么bash自带的功能基本都一样,且macos从BSD那继承了很多东西,BSD和linux又高度兼容,所以差异不太大
好多命令行工具,是在bash下调用的,而mac和ubuntu安装的工具一定有差异,另外二者目录结构也有差异,
另外mac的shell更显严谨,linux的shell更随意灵活一些
VS自己把代码作了很多修改~入口函数好像是t_main,这个是可能是它修改了链接规则~
但是一般大家的做法是自己去在Linux下写了~毕竟编译、运行、测试环境都必须在Linux下进行~你用VS最多也就编编代码,编译和调试没办法进行的
因为windows下的可执行文件和linux并不相同~你必须去linux下编译C程序~Linux下也有很多IDE,比如codeblocks、eclipse之类~写代码、调试什么的很方便~
来说大部分的区别在于系统提供的接口不同,也就是需要调用的函数不同~其他的目前为止你都可以认为是一样的~
你说的在shell下调用,需要有main的参数,这个叫命令行参数,不仅仅是linux下有,windows下也有~具体处理方式应该也差不多~查查资料很快就明白了
如今我们正在开发一个新的插件,一个能够让开发者在 Visual Studio (以下简称 VS ) 上建构能够在 Linux 上运行 C++ 程序的套件。开发者可以借由这个插件将 C++ 程序移转到 Linux 服务器、PC 以及移动设备上,也同时可以借由这个插件将这些机器连结至你的 VS 上。 VS 将会自动地复制一份并在远端建构你的来源档,再运行带有除错器的应用程序。我们的这项计划也针对特殊的架构提供系统支持,包含 ARM 等。下方文章将继续介绍使用我们这套全新的 Linux 计划。
目前我们仅支持在远端的目标 Linux 机器提供建构服务。我们并没有限制特定的 Linux 发布版本,但我们仍旧在一些工具的表现上有些相依性的差异。需要特别注意的是,我们需要 openssh-server、g++、gdb 以及 gdbserver。用你最习惯的套件管理工具来安装他们,例如在 Debian 类型的 Linux 就可以使用:
[cpp] view plain copy
sudo apt-get install openssh-server g++ gdb gdbserver
安装
下载 Visual C++ for Linux Development extension 或从 Visual Studio 上的插件管理员来获得。目前我们在Visual Studio 上的 Android Tools 上已有相依支持。如果你已经安装了 VS 的话,你可以借由 Add Remove Programs 来新增这些功能,编辑 VS 然后在 Visual C++ 移动设备开发下选择他们。
要开始一个新的项目可以透过以下路径:Templates Visual C++ Cross Platform Linux。
目前我们有三个可以使用的模板:针对像 Raspberry Pi 等物联网装置设计的 Blink、最基本的应用程序样板 Console Application 以及让开发者自己选择需要加入的来源档以及从预设设定起的 Empty。
你的第一个 VS Linux 项目
我们从建构一个主控台 app 开始。从模板新增完你的项目后,在 printf 叙述句的地方设下一个中断点,然后敲击 F5 或远端 GDB 除错器按钮。根据预设值,这个主控台 app 设定与 debug/x64 的环境相容。如果你的远端连线标的是 x86 或 arm 架构,那你需要先改变上述设定。在我演示的这个范例我使用的是 x64 Ubuntu VM。
由于这是第一次连结到标的的 Linux 机器,所以会弹出一个连接资讯视窗,是由在建构项目时所触发的。
我们同时支持密码以及认证形式的验证方式,包含使用复杂密码的认证。在第一次成功连接后,我们会将你的连结资讯储存以便在日后需要连接时快速存取。你可以从 Tools Options Cross Platform Linux 的路径来管理你已储存的连结资讯,以及是的,密码/复杂密码是已加密形式储存的。我们也同时计划在未来的更新版本中,在连接时无需储存连结资讯。
在连接的过程中,你的来源档会被复制到远端的 Linux 机器上,并触发 gcc 并根据项目的属性设定来建构原始码。在项目建构完毕之后,你的程序将会在远端的机器上执行,并停止在我们先前所设下的中断点上。
Linux 项目属性
我们可以借由以下的项目属性来理解,东西是怎么被部署到远端 Linux 机器上的。
在 remote settings 下,你可以看到 remote 根目录是预设在 ~/projects/ ,且该路径下的远端项目目录会与我们的项目名称相符。从 Linux 机器上去看的话,我们可以在 ~/projects/ConsoleApplication1 下发现建构后的成品 main.cpp。
根据项目的 General setting,可以了解到我们针对 Output 以及 Intermediate 路径是怎么设定的。除此之外,你可以发现到这个项目是被设定成一个应用程序的 — 代表我们的项目执行档 ConsoleApplication1.out 是在 bin/x64/Debug/ 路径下。另外可以注意到的是,我们也同时支持静态以及动态的设定格式。
Linux 物联网项目
现在我们来研究物联网装置的部分 — 以 Raspberry Pi 为例。你可以使用任何类型的 Pi 来执行 Raspbian。在我们的 Blink 范例里我们使用 wiringPi — 如果你没有这个安装选项你也可以选择从 apt 或来源档来安装。在 Tools Options 搜寻 Linux 来新增一个连结,然后点击 “add” 来新增一个连结到你的 Raspberry Pi。
从项目属性设定的地方查看 Build Events 下的 Remote Post-Build Events。
你可以借由这个设定在远端已建构好项目的 Linux 标的上执行指令。这个模板已先预设了针对 LED 输出的 GPIO pin,所以我们不需要再以 root 的身份执行我们的执行档。
现在将一个 LED 连接到 Raspberry Pi 上的 pin 17 位置,如下图:
打开 main.cpp 档,并在第一个 digitalWrite 后 delay call 的地方设下中断点,然后敲击 F5。你可以看到你的 LED 灯亮起,且执行程序会在你下中断点的地方停住。将你的程序持续执行到下一个 digitalWrite call 之后便可以看到 LED 灯熄灭。
可以透过浏览我们的物联网研发专页,来追踪所有我们目前针对这样的系统所释出的功能。
桌面应用程序
我们刚已在上述的文章中,介绍了无介面 (headless) 以及装置型的 Linux 应用程序,那桌面型的呢?在这里我们将介绍一点特别的:我们将在 Linux 桌面上执行一个 OpenGL 应用程序。首先要确定的是,你的 Linux 桌面已经设定为包含 OpenGL 的环境,下述是我们会需要用到的 apt 套件:libgles1-mesa、libgles1-mesa-dev、freeglut3 以及 freeglut3-dev。
接下来请先创建一个空的 Linux 项目,然后前往 Julien Guertault’s OpenGL 教学下载旋转方块的来源档,将其解压缩并将 main.c 加到你的项目下。要能够运行 Intellisense,你需要将 OpenGL 的标头 (headers) 新增到 VC++ Directories,你可以从 OpenGL Registry 里下载他们。现在前往你的项目属性设定,然后新增 export DISPLAY=:0.0 到 Pre-Launch command 下。
然后,在 Linker Input 下新增 “m;GL;GLU;glut” 到 Library Dependencies 栏位。
另外,确认你的远端设定是对应到对的机器。
接下来按下 F5。
还有一些有趣值得下中断点的地方,例如大约在 80 行左右的位置有可以调整方块旋转的设定(试着调整看看 alpha 值),或在 KeyboardFunc 里可以检查按下键盘时所输入的值。
开启原生 Linux 应用开发之旅吧
我们期望您与我们对于这些新开放的可能拥有一样的期待。
安装 Visual C++ for Linux Development extension,尝试看看并告知我们哪些是你可以成功运行,以及哪些是你遇到的阻碍或遭遇任何问题。如果你有兴趣的领域是在物联网的部分的话,可以前往关注我们的 IoT Development page 以获取最新资讯。你可以借由这个部落格,或展览页的额外分页、VS 回馈频道以及 Twitter 上的 @visualc、@robotdad 或我的帐号联系到我们