我本质上想在机器 A 上运行一个脚本,该脚本将通过 SSH 连接到机器 B,在 B 上执行命令,并将输出返回到机器 A。
所以我正在创建一个 csh 脚本来做到这一点,如果可能的话。
例如,此答案中的此解决方案适用于命令行:
ssh user@host << 'ENDSSH'
ls -l
ENDSSH
Run Code Online (Sandbox Code Playgroud)
我可以验证它是在远程而不是本地运行 ls。
但是,我希望能够在本地运行的 csh 脚本中的反引号内执行此操作。那可能吗?
我知道可以通过 SSH 连接并运行远程脚本,但这不是我的情况。
我还听说可以通过 SSH 发送本地存储的第二个脚本(我也没有弄清楚),但我喜欢将所有命令都包含在原始脚本中的想法,因此是 HEREDOC。
我知道这是一个非常特别的问题,但如果有办法,知道如何做会很酷。
行不通的事情
1)
`ssh user@host<<'ENDSSH'`
`echo "ls -l"`
`echo "ENDSSH"`
Run Code Online (Sandbox Code Playgroud)
这给出了错误:
stty: standard input: Invalid argument.
stty: standard input: Invalid argument.
Warning: Command not found
然后它在ls -l
本地运行,然后它尝试在ENDSSH
本地运行,当然由于找不到命令而失败。
2)
`ssh user@host<<'ENDSSH'`
echo "ls -l"
echo "ENDSSH"
Run Code Online (Sandbox Code Playgroud)
与上面相同的问题,除了它只显示ls -l
和ENDSSH
作为文本。有道理……因为 HEREDOC …
我有一个 Win10 文件服务器,它通过网络共享托管内容,例如代码存储库。
我在 Linux 上进行所有编码和开发,主要是 CentOS 或 Lubuntu,所以我遇到了非常有用的:
mount -t cifs....
允许我轻松安装 Windows 共享的命令。但是我遇到的问题是尝试从共享安装中的来宾创建符号链接。具体来说,诸如此类的事情会automake --add-missing
失败,因为它试图创建指向诸如此类install-sh
文件和其他文件的符号链接。
我知道由于 Linux 和 Windows 之间的差异而存在复杂性,但我不确定是否存在可以在服务器上启用的选项,可能还有客户端,以允许这样做。
我读过一些书,但网上的其他答案对我来说似乎不太清楚。例如这篇文章:符号链接权限被拒绝,通过 cifs 共享文件夹,-似乎表明使用该sfu (Services For Unix)
选项应该是可能的。它表示 cifs 内核模块必须至少是1.4
.
2.03
我的 CentOS 7.1 机器上有版本,并尝试过:sudo mount -t cifs -o username=,password=,sfu //Remote_Server/Share /Share
没有成功。我还打开了 Windows 中的权限,secpol
以允许我的 Windows 用户帐户创建符号链接。(我不确定这是否可能是一个因素,以防万一该实现试图在双方创建符号链接并且由于我的 Windows 帐户权限而无法创建)。我可以在 windows cmd 提示符下使用该mklink
命令以管理员身份运行,但是当尝试在 linux 来宾上创建标准符号链接时,这仍然会导致failed to create symbolic link:........Operation not supported
那么有什么方法可以让 CIFS 和我当前的解决方案简单地使用它?或者是否有任何解决方案可以以某种方式抽象出 Linux 和 …
我可以轻松地从函数调用(在子shell中)捕获标准输出到变量:
val="$(get_value)"
Run Code Online (Sandbox Code Playgroud)
我还可以通过引用修改 shell 中的变量(例如,数组),可以在同一个 shell 中使用以下内容进行修改:
function array.delete_by_index {
local array_name="$1"
local key="$2"
unset "$array_name[$key]"
eval "$array_name=(\"\${$array_name[@]}\")"
}
array.delete_by_index "array1" 0
Run Code Online (Sandbox Code Playgroud)
但是我正在努力弄清楚如何做,以干净的方式同时进行。我想要的一个例子是从数组中弹出一个值:
function array.pop {
local array_name="$1"
local last_index=$(( $(eval "echo \${#$array_name[@]}") - 1 ))
local tmp="$array_name[\"$last_index\"]"
echo "${!tmp}"
# Changes "$array_name" here, but not in caller since this is a sub shell
array.delete_by_index "$array_name" $last_index
}
val="$(array.pop "array1")"
Run Code Online (Sandbox Code Playgroud)
在我看来,将标准输出捕获到变量的所有形式都需要 bash 中的子 shell,而使用子 shell 将不允许我在调用者的上下文中通过引用更改值。
我想知道是否有人知道一种神奇的 bashism 来实现这一目标?我并不特别想要在文件系统上使用任何类型的文件/fifo 的解决方案。
这个问题的第二个答案似乎表明这在ksh
using 中是可能的val="${ …
在 /etc/shadow 中,我可以看到几个具有完全相同的盐和哈希值(以及密码)的用户。
系统怎么会变成这样?这是否意味着密码不是通过生成的passwd
(认为 passwd 随机化了盐)?这特别糟糕吗?