互联网上的每个人都建议禁用通过SSH进行 root 登录,因为这是一种不好的做法,而且是系统中的一个安全漏洞,但没有人解释为什么会这样。
启用 root 登录(尤其是禁用密码登录)有什么危险?
如果允许密码验证,从安全角度来看,X 符号用户名和 Y 符号密码或 root 用户名和 X+Y 符号密码有什么区别?
有 5 个大文件(file1、file2、..file5),每个文件大约 10G,磁盘上剩余的可用空间极少,我需要将所有这些文件连接成一个。不需要保留原始文件,只保留最后一个。
通常的连接是cat按顺序进行的文件file2.. file5:
cat file2 >> file1 ; rm file2
Run Code Online (Sandbox Code Playgroud)
不幸的是,这种方式需要至少 10G 的可用空间,我没有。有没有办法在不实际复制文件的情况下连接文件,但以某种方式告诉文件系统 file1 不会在原始 file1 结束处结束并在 file2 开始处继续?
附:如果重要的话,文件系统是 ext4。
有没有办法通过变量重定向 stdout 和 stderr,比如在脚本中添加命令选项?
例如我有一个脚本:
#!/bin/bash -x
TEST=">/dev/null 2>&1"
OPT='-p -v'
mkdir $OPT 123/123/123 $TEST
Run Code Online (Sandbox Code Playgroud)
我可以看到 OPT 被替换为-p没有任何问题,bash 将其解释为选项。但重定向解释为目录名称。
$ ./test.sh
+ TEST='>/dev/null 2>&1'
+ OPT='-p -v'
+ mkdir -p -v 123/123/123 '>/dev/null' '2>&1'
mkdir: created directory `123/123'
mkdir: created directory `123/123/123'
mkdir: created directory `>/dev'
mkdir: created directory `>/dev/null'
mkdir: created directory `2>&1'
Run Code Online (Sandbox Code Playgroud)
有什么办法可以说 bash,$VAR 是重定向,而不是目录名称。
附注。可能是我走错了路,但我想从我的脚本中制作可选的详细或非详细输出。但是即使在非详细模式下我也需要一些输出,因此我不能只重定向整个 stdout 和 stderr,只能从脚本中的某些命令重定向。
有没有办法+x在创建时在脚本上设置位?
例如我运行:
vim -some_option_to_make_file_executable script.sh
Run Code Online (Sandbox Code Playgroud)
保存后我可以运行文件而无需任何额外的移动。
附:我可以chmod从vim甚至从控制台本身运行,但这有点烦人,原因vim建议重新加载文件。chmod每次输入命令也很烦人。pps。根据文件扩展名制作它会很棒(我不需要可执行文件.txt:-))
我的意思是当某个进程想要读取符号链接时发生了什么?在读取甚至写入过程中更改符号链接时会发生什么?
例如:我有 2 个巨大的、类似的 100G 文件/mnt/1和/mnt/2. /mnt/1可通过符号链接获得/home/user/file。一些程序A开始阅读/home/user/file。过了一会儿,链接从/mnt/1到/mnt/2,但A仍在读取文件。
程序是否缓存了绝对路径?
它会失败并出错,因为符号链接已更改,还是会正常工作,就像什么也没发生一样?
如果/home/user/file链接到块设备(例如 2 个复制的 iSCSI 磁盘),它会有所不同吗?
$ echo $SHELL
/bin/bash
$ /bin/ksh93
$ echo $SHELL
/bin/bash
$ file /bin/ksh93
/bin/ksh93: ELF 64-bit LSB executable, x86-64, version 1 (SYSV),
dynamically linked (uses shared libs), for GNU/Linux 2.6.8, stripped
$ getent passwd test111
test111:x:1008:1008:,,,:/tmp:/bin/ksh93
$ ssh test@localhost
test@localhost's password:
$ echo $SHELL
/bin/ksh93
$ bash
$ echo $SHELL
/bin/ksh93
Run Code Online (Sandbox Code Playgroud)
我希望$SHELL在运行另一个 shell 后改变。为什么不呢?
PS 但是外壳确实发生了变化,只有 $SHELL 变量保持不变:
$ dash
$ echo $SHELL
/bin/bash
$ T=test ; [[ $T = *est ]] && echo ok
dash: [[: not …Run Code Online (Sandbox Code Playgroud) 有没有像 grep,甚至uniq但不精确的搜索,或者我应该写自己?
我的意思是会看90%(数量可能会有所不同)的匹配,或类似的东西。比如我有几个字符串的文件:
abc123
abd123
abc223
qwe938
Run Code Online (Sandbox Code Playgroud)
在这种情况下,此类实用程序应返回前三个字符串或说它们相似。当然,我不知道文件内容的任何模式,例如grep或uniq。
实际上,我想做一些类似ifconfig.me 的功能,但仅适用于我的内部网络。我认为服务器上的某些东西侦听某个端口并发送连接的远程机器的 ip 的方式。
似乎nc对我的问题来说是一个很好的实用程序(而且我在服务器上没有任何 php/python/任何东西。只有 shell 和标准的 unix 工具)。
如果我nc -vv从远程系统启动并连接到它,我可以看到远程 ip 和 dns 名称,但我找不到将它们发送到远程主机的方法。
或者我选择了太奇怪的路径,还有另一个更简单的解决方案?
默认情况下会xterm启动一个交互式 shell。但是您也可以将其配置为启动交互式login-shell。
这意味着通过启动一个xterm你会得到同一种 shell,就像通过 ssh/虚拟控制台/su 登录一样。
在 xterm 中配置login-shell的优点/缺点是什么?
我能想到:
uptime,w,last等报告尽可能多的用户xterm的开放。(优势?)bash只有 source .login, .profile,/etc/profile.d当作为login-shell启动时zsh有类似的文件,它在作为login-shell启动时读取- 但在我的系统上,默认情况下它们是空的相关xterm手册页部分:
Run Code Online (Sandbox Code Playgroud)-ls This option indicates that the shell that is started in the xterm window will be a login shell (i.e., the first character of argv[0] will be a dash, indicating to the shell that it …
这主要是理论问题,没有实际应用。
您可能知道,文件名存储在目录 inode 中。这意味着我们拥有的文件越多,文件名越长,目录使用的空间就越多。
不幸的是,如果从目录中删除文件,则目录使用的空间不会释放并且仍在使用。
$ mkdir test ; cd test
# next command will take a while ; for me it was about 6 minutes
$ for ((i=1;i<103045;i++)); do touch very_long_name_to_use_more_space_$i ; done
$ ls -lhd .
drwxr-xr-x 2 user user 8.6M Nov 9 22:36 .
$ find . -type f -delete
$ ls -l
total 0
$ ls -lhd .
drwxr-xr-x 2 user user 8.6M Nov 9 22:39 .
Run Code Online (Sandbox Code Playgroud)
为什么删除文件后目录使用的空间没有更新?有没有办法在不重新创建目录的情况下释放空间?
我正在尝试制作一个deb包。但林天却有警告:
W: package: script-not-executable etc/package/hooks/script
Run Code Online (Sandbox Code Playgroud)
它是一个脚本,但没有人直接执行它。我在另一个脚本中获取了它。
我是否需要使其可执行才能传递 lintian,或删除其 shebang 标头?
有什么方法可以一次替换多个模式的变量中的文本,甚至使用反向引用?
例如,我有FILE=filename.ext并且我想将其更改为filename_sometext.ext. 但我不知道文件扩展名是.ext. 我所知道的是扩展名在最后一个点之后。所以我可以分两步完成:
EXT=${FILE##*.}
FILE=${FILE%.*}_sometext.$EXT
Run Code Online (Sandbox Code Playgroud)
我可以一步完成吗(类似${FILE/.\(*\)/_sometext.\1}[那行不通])?
顺便说一句,我需要在没有sed/ awk/etc 的纯 shell 中执行此操作。我的外壳是ksh,但如果有办法用 bashisms 来做到这一点,我也想知道它。
我在网络设置方面遇到问题,而我较差的网络知识或我当地的 Linux 社区无法帮助我。
我有服务器 A(就在我的 PC 附近),它隐藏在 NAT 路由器后面,还有服务器 B,它是具有静态 IP 的 VPS。
我想使用我的服务器 A 作为网络服务器,可以从互联网上的任何地方访问(并且此后,作为自己的小型网络托管)。我已经意识到如何通过互联网反向SSH隧道通过 SSH 通过服务器 B 访问服务器 A。但这东西有两个缺陷:
ssh -p 22222 username@localhost有什么解决方案可以将所有端口传递到现有隧道吗?我在互联网上找到的所有内容都是关于或创建反向隧道或将端口传递到直接隧道,但不是关于传递到现有的反向隧道。