小编Chr*_*ski的帖子

调试为什么 nix 在应该位于 nixpkgs 二进制缓存中的情况下构建了不必要的包?

我在 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)

nixos nix

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

为什么我在以用户身份运行 sudo 时没有足够的权限

以下失败:

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 用户更改为提供的参数。这种行为背后的原因是什么?

permissions sudo

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

使用 pam_exec.so 以 root 身份运行脚本时,脚本无法在登录时运行

当用户使用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(如类似问题所建议的那样),它永远不会运行。

编辑

添加seteuidpam_exec.so命令允许脚本在用户进行身份验证 ( su - …

linux authentication pam centos shell-script

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

折叠的 unicode 安全替代方案

我正在使用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)

sed fold

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

如何升级 Nixos 以使用新的频道 nixos 版本?

我目前在 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”。

nixos nix dist-upgrade

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

如何诊断失败的 nix-build?

如何诊断 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)

我希望找到一些日志/错误,说明为什么它无法构建?


以下来自/sf/answers/3308506281/

我已经尝试添加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)

nix

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

Nixos 无法修改或 chmod nix 配置 - '/etc/nix/nix.conf'

[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 内核实用程序来更改它,但我不确定它叫什么?

permissions nixos nix

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

如何在 nix 派生中克隆私有 git 存储库

{
  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)

nix

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

如何确定 Hydra 中为 Nix nixpkgs 缓存的软件包版本?

我试图用旧的 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)

nixos nix

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

如何从uid获取用户名

我正在尝试编写一个 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)

当我执行这个终端只显示提示信息然后停止工作。

我错过了什么吗?

linux shell bash

5
推荐指数
2
解决办法
8447
查看次数

标签 统计

nix ×6

nixos ×4

linux ×2

permissions ×2

authentication ×1

bash ×1

centos ×1

dist-upgrade ×1

fold ×1

pam ×1

sed ×1

shell ×1

shell-script ×1

sudo ×1