我经常发现自己需要编写脚本,这些脚本必须作为普通用户执行某些部分,而其他部分则作为超级用户执行.我知道在SO上有一个类似的问题,答案是两次运行相同的脚本并将其作为sudo执行,但这对我来说还不够.有时我需要在sudo操作后恢复为普通用户.
我在Ruby中编写了以下内容来执行此操作
#!/usr/bin/ruby
require 'rubygems'
require 'highline/import'
require 'pty'
require 'expect'
def sudorun(command, password)
`sudo -k`
PTY.spawn("sleep 1; sudo -u root #{command} 2>&1") { | stdin, stdout, pid |
begin
stdin.expect(/password/) {
stdout.write("#{password}\n")
puts stdin.read.lstrip
}
rescue Errno::EIO
end
}
end
Run Code Online (Sandbox Code Playgroud)
不幸的是,如果用户输入错误的密码,则使用该代码会导致脚本崩溃.理想情况下,它应该让用户3尝试正确获取sudo密码.我该如何解决?
我在Linux Ubuntu BTW上运行它.
我正在为我的大学开展一个小组高级项目,并且在尝试使我的代码工作时遇到了一个主要障碍.
我们为8位Atmel微控制器提供的编译器不支持new或delete运算符,并且它不支持C++ STL.我可以用C编程,但是我必须实现一个我从未做过的A*算法.虽然我最初尝试过C,但我很快意识到我以前从未做过纯C.尝试使用结构和函数对对象进行建模正在减慢我的速度,因为我已经习惯了更清晰的C++语法.
无论如何,我的编译器缺点的确切措辞可以在这里找到:http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_cplusplus
为了克服它们并仍然使用C++,我考虑了以下可能性.1)不要分配任何东西,只需使用模板在堆栈上生成固定数组.2)在为对象分配空间后,分配并找到一些hack来调用对象的构造函数.由于new不是运营商,因此不能选择新的展示位置.3)只需使用C并将其吸收,它是一个微控制器为什么我会变得喜欢?4)找到一个更好的编译器,可能会花费$$$.
第二种选择是最难的,但就我如何编写这段代码而言,它将获得最大的回报.但是,我想如果我弄错了调试它可能是一个巨大的痛苦.我正在考虑在堆栈上创建对象,将它们的位复制到分配的空间中,然后将对象中的位清零,这样它就不会调用它的析构函数.为此,我将使用unsigned char指针和sizeof运算符直接访问这些位以获取字节数.
这听起来很糟糕,我不知道它是否可以正常工作,但我正在考虑它.我知道vtable可能有问题,但我不打算使用任何vtable,因为它只是一个8位微控制器.
为什么示例A工作,而示例B抛出"JAXB注释放在不是JAXB属性的方法上"异常?
我正在使用JAX-WS和Spring MVC.
例A
package com.casanosa2.permissions;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.PROPERTY)
@XmlType(name = "FooXMLMapper")
public class FooXMLMapper implements IFoo {
@XmlElement
private final boolean propA;
@XmlElement
private final boolean propB;
public FooMapper(IFoo foo) {
propA = foo.getPropA()
propB = foo.getPropB()
}
public FooMapper() {
propA = false;
propB = false;
}
@Override
public boolean getPropA() {
return propA;
}
@Override
public boolean getPropB() {
return propB;
}
}
Run Code Online (Sandbox Code Playgroud)
例B
@XmlAccessorType(XmlAccessType.PROPERTY)
@XmlType(name = "FooXMLMapper")
public class FooXMLMapper …
Run Code Online (Sandbox Code Playgroud) 我有一个 git 存储库,与几个开发人员共享。我们使用它定期进行 git pull 和 push。不幸的是,每次我执行 git pull 更改的文件时,都会失去组写入权限。我如何阻止 git 这样做?
我在 Ubuntu 12.04 LTS 上运行它。
共享存储库上的配置如下所示:
[core]
repositoryformatversion = 0
filemode = true
bare = true
sharedRepository = group
Run Code Online (Sandbox Code Playgroud)
我还在它上面运行了以下命令以试图修复它
find repo.git -type d -exec chmod g+rws {} +
sudo chmod -R g+rw repo.git/objects
Run Code Online (Sandbox Code Playgroud)
不管我最终得到 755 的文件夹和 644 的文件,当我分别想要 775 和 664 时。
我正在尝试按照教程在Linux中创建自定义USB驱动程序,我希望在使用g ++的Ubuntu Eee的Eee PC上开发这个东西.不幸的是,按照教程我需要linux/module.h头文件.根据我的理解,我将需要编译内核以使其工作.我以前从未编译过内核,我发现的所有指令都是针对桌面Ubuntu的.
我在我的Eee上这样做,因为如果我能在课堂上使用它并在课堂项目中使用它,我会在课堂上获得额外的学分.
我关注的教程如下:http://www.linuxjournal.com/article/7353 ,在这里:http://www.linuxjournal.com/article/4786
我有一个带有以下npm dependancies的grunt项目:
我在VirtualBox VM中创建了一个Ubuntu 12.04 64位服务器(来自Ubuntu主机),并运行以下命令:
sudo apt-get update
sudo apt-get install -y ruby rubygems gcc python make
sudo gem install compass
wget http://nodejs.org/dist/v0.10.15/node-v0.10.15.tar.gz
tar -xzf node-v0.10.15.tar.gz
cd node-v0.10.15/
./configure
make
sudo make install
cd ../
rm -Rf node-v0.10.1
rm node-v0.10.15.tar.gz
sudo npm install -g grunt-cli
Run Code Online (Sandbox Code Playgroud)
据说安装了npm.然后我使用git clone来克隆我在CentOS中使用的grunt项目(它在CentOS中都有效).不幸的是,当我运行grunt时尝试使用以下错误运行qunit失败:
运行"qunit:dist"(qunit)任务测试/home/testuser/myproject/test/index.html确定
运行PhantomJS ......错误
为了使此任务正常工作,必须通过NPM在本地安装PhantomJS.如果您看到此消息,通常这意味着NPM安装失败.请提交尽可能详细的问题:https: //github.com/gruntjs/grunt-lib-phantomjs/issues警告:未找到PhantomJS.使用--force继续.
因警告而中止.
我甚至从grunt文件夹运行了npm update,它仍然有这个错误.
我错过了什么?
编辑 请注意以下事实:
linux ×3
c++ ×2
c ×1
command-line ×1
cxf ×1
embedded ×1
git ×1
gruntjs ×1
java ×1
jax-ws ×1
jaxb ×1
linux-kernel ×1
qunit ×1
ruby ×1
spring-mvc ×1
ubuntu ×1
ubuntu-12.04 ×1