我在 IRC 频道中提出了这个问题,但我想我应该在这里记录下来以供我自己和其他人参考。
我有一个 shell.nix 文件需要很长时间才能构建,特别是它似乎正在构建一个HUnit包。
我的 shell.nix 文件如下所示:
{
sources ? import ./nix/sources.nix
, compiler ? "ghc865" } :
let
niv = import sources.nixpkgs {
overlays = [
(_ : _ : { niv = import sources.niv {}; })
] ;
config = {};
};
pkgs = niv.pkgs;
myHaskellPackages = pkgs.haskell.packages.${compiler}.override {
};
in
myHaskellPackages.callCabal2nix "moscoviumorange" (./.) {}
Run Code Online (Sandbox Code Playgroud)
源被固定到(使用 niv):
{
"niv": {
"branch": "master",
"description": "Easy dependency management for Nix projects",
"homepage": "https://github.com/nmattia/niv",
"owner": "nmattia",
"repo": …Run Code Online (Sandbox Code Playgroud) 以下失败:
sudo -u chris ls /root
ls: cannot open directory '/root': Permission denied
Run Code Online (Sandbox Code Playgroud)
虽然以下成功:
sudo ls /root
...
Run Code Online (Sandbox Code Playgroud)
我不理解为什么。我假设除了具有 root 权限之外,还-u只是将$USER/running 用户更改为提供的参数。这种行为背后的原因是什么?
当用户使用pam_exec.so(或以其他方式)登录时,如何以 root 身份运行脚本?该脚本需要有关用户的信息才能运行。
我想在/path/script.sh每次用户登录时以 root身份运行一个脚本。我还需要知道登录的用户(例如作为环境变量或脚本的参数)。我使用的是最新版本的 CentOS 7。
我目前正在编辑/etc/pam.d/system-auth并添加以下行:
session optional pam_exec.so /path/script.sh
Run Code Online (Sandbox Code Playgroud)
当我成为具有 的用户时sudo su,这工作正常,但如果我对用户进行身份验证,则不起作用(脚本必须以 root 身份运行)。换句话说,
$ su - robot7
Password:
/path/script.sh failed: exit code 1
-bash-4.2$
Run Code Online (Sandbox Code Playgroud)
失败而
$ sudo su - robot7
Last login: Thu Jun 14 09:33:56 MDT 2018 on pts/5
-bash-4.2$
Run Code Online (Sandbox Code Playgroud)
工作并按预期运行脚本,但有一个警告:当用户断开连接时,脚本也会运行。$PAM_USER第二种情况下的变量是正确的用户名(robot7,而不是 root)。
该脚本将用于生产环境中,用户不能禁用它并且可能有不同的外壳;我无法使用类似.bashrc或其他脚本来运行它。
如果我将命令设置/etc/pam.d/system-auth为运行auth而不是session(如类似问题所建议的那样),它永远不会运行。
添加seteuid到pam_exec.so命令允许脚本在用户进行身份验证 ( su - …
我正在使用fold -w 3将一行拆分为多个 3 个字符长,但是对于 GNU 实现,它似乎不适用于具有多字节字符的文本。
我怎样才能实现上述目标sed?
我想出了sed -r 's/^(.{0,3})(.*)/\1\n\2/g'但是这只会做一个替换:
echo "111222333444555666" | sed -r 's/^(.{0,3})(.*)/\1\n\2/g'
111
222333444555666
Run Code Online (Sandbox Code Playgroud)
附加示例:
echo "???????????????????????" | sed -r 's/^(.{0,3})(.*)/\1\n\2/g'
???
????????????????????
Run Code Online (Sandbox Code Playgroud)
并且fold它的破坏行为:
echo "???????????????????????" | fold -w 3
??
??
??
??
??
Run Code Online (Sandbox Code Playgroud) 我目前在 18.03 并且想升级到 18.09。我该怎么做呢?
我通过网络搜索找到了以下内容,但不是很确定:https : //discourse.nixos.org/t/how-to-upgrade-from-18-03-to-18-09/933
我假设我可能只是更改我引用的频道nixos?但我不确定这是否适合在出现问题时允许回滚。
sudo nix-channel --list
nixos https://nixos.org/channels/nixos-18.03
unstable https://nixos.org/channels/nixos-unstable
Run Code Online (Sandbox Code Playgroud)
此外,我还看到了以下内容:https : //github.com/NixOS/nixpkgs/issues/40351#issuecomment-388405973(引用如下) - 我需要考虑这一点吗?
还:
/etc/nixos/configuration.nix:
# 这个值决定了你的系统要兼容的 NixOS 版本,以避免破坏一些软件,比如数据库 # 服务器。只有在 NixOS 发行说明说你应该这样做之后,你才应该改变它。system.stateVersion = "17.09"; #你看评论了吗?我没有看到何时发出更改此命令的命令。
我阅读了发行说明、新闻和可用信息。等待命令执行它,但没有找到。
无论如何,发布几天后,我更改了“17.09”->“18.03”。
如何诊断 nix-build 失败?
目前我看到输出为:
nix build -v
warning: dumping very large path (> 256 MiB); this may run out of memory
building '/nix/store/fdrm6kbm68vld3bhfjizv684ck725lyf-blog.drv'...
builder for '/nix/store/fdrm6kbm68vld3bhfjizv684ck725lyf-blog.drv' failed with exit code 1; last 5 log lines:
unpacking sources
unpacking source archive /nix/store/s7r5vlvp49ad6a9d5hqhsiaxw691iyhf-Blog
source root is Blog
patching sources
configuring
[0 built (1 failed), 0.0 MiB DL]
error: build of '/nix/store/fdrm6kbm68vld3bhfjizv684ck725lyf-blog.drv' failed
Run Code Online (Sandbox Code Playgroud)
我希望找到一些日志/错误,说明为什么它无法构建?
我已经尝试添加build-cache-failures = true;到,default.nix但是我仍然看不到以下输出:
nix-store --read-log
Run Code Online (Sandbox Code Playgroud)
而nix-store --query-failed-paths结果:
error: no operation …Run Code Online (Sandbox Code Playgroud) [root@nixos:/etc/nix]# sudo chmod 777 /etc/nix/nix.conf
chmod: changing permissions of '/etc/nix/nix.conf': Read-only file system
Run Code Online (Sandbox Code Playgroud)
我记得这是一些文件系统/Linux 内核实用程序来更改它,但我不确定它叫什么?
{
nixpkgs ? import <nixpkgs> {}
}:nixpkgs.pkgs.fetchgitPrivate {
url = "ssh://git@gitlab.com/trycatchchris/blog.git";
rev = "0f5fe7ebf0724eb17aea4141e0cf3f1758a6d716";
sha256 = "02951e82c1183aaf1ce4b9669bf9ae32e50c4c641550797eed37739cd4528b58";
}
Run Code Online (Sandbox Code Playgroud)
我有上面的 nix 表达式,其中存储库是私有 git 存储库。
我确实可以通过我的用户的公钥访问此存储库。
如果我尝试常规nix-build:
nix-build
trace: Please set your nix-path such that ssh-config-file points to a file that will allow ssh to access private repositories. The builder will not be able to see any running ssh agent sessions unless ssh-auth-sock is also set in the nix-path.
Note that the config file and any keys it points to …Run Code Online (Sandbox Code Playgroud) 我试图用旧的 nixpkgs 通道/分支(18.03)构建一个旧的 Haskell 项目。
在我第一次尝试构建它时,我将编译器版本指定为ghc843...但是在构建时 - 当我期望它来自缓存时,它似乎正在构建所有外部库。
幸运的是,我记得我之前遇到过这个问题:调试为什么 nix 不必要地构建一个包,而它应该位于 nixpkgs 二进制缓存中?
问题基本上是我使用的是 ghc 的“非默认”版本(Hydra 不会构建/缓存)。
所以现在我的问题是,我怎样才能找到“默认”编译器版本 - 或者 Hydra 构建/缓存的版本?
{
nixpkgs ? import <nixpkgs> {}
, sources ? import ./nix/sources.nix
, compiler ? "ghc843" } :
let
niv = import sources.nixpkgs {
overlays = [
(_ : _ : { niv = import sources.niv {}; })
] ;
config = {};
};
pkgs = niv.pkgs;
myHaskellPackages = pkgs.haskell.packages.${compiler}.override {
};
in
(myHaskellPackages.callCabal2nix …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个 bash 脚本,该脚本根据用户提供的 uid 显示用户名:
#!/bin/bash
read -p "donner l UID" cheruid
if [ $(grep -w $cheruid) -n ]
then
grep -w $cheruid /etc/passwd | cut -d ":" -f "1" | xargs echo "user is : "
else
echo "user not found"
fi
Run Code Online (Sandbox Code Playgroud)
当我执行这个终端只显示提示信息然后停止工作。
我错过了什么吗?
nix ×6
nixos ×4
linux ×2
permissions ×2
bash ×1
centos ×1
dist-upgrade ×1
fold ×1
pam ×1
sed ×1
shell ×1
shell-script ×1
sudo ×1