我很好奇,我经常想在会话期间将所有 shell 设置(点文件)传输到远程会话,然后在注销时将其恢复。更好的方法是只在此会话中激活这些设置,以便其他登录的人也可以拥有 shell 的默认设置或他们自己的自定义设置。
目前有没有办法做到这一点,还是需要我自己编写一个自定义解决方案来实现此功能?我目前没有看到任何真正的选择来实现这一点。
答案1
您不需要编写太多内容(只需编写一个 shell 脚本)。工具已经存在。使用它们仅导出您需要的内容,以避免修复其他人的 shell 函数的负担。
(set; alias) |
ssh -l root 10.3.0.8 'mkdir ~/tmp 2>/dev/null; cat > ~/tmp/.import'
这不是故障安全的,因此您应该尝试输出直到您认为它正常工作。
(set; alias) > ~/tmp/import
bash -n tmp/import
tmp/import: line 6085: syntax error near unexpected token `('
tmp/import: line 6085: ` !(?(*/)python*([0-9.])|-?))'
对于仅有环境变量的情况来说这不是什么问题,因为可解析的格式很容易执行:
env | sed -Ee "
s/'/\\\\'/g;
s/=(.*)/='\1'/
" > tmp/export.vars-only
并且可以像这样只导出您的函数。
declare -f `grep ^function ~/.functions | awk '{print $2}'`
如果你使用moo() { true;}
语法来声明它们或者其某种变体,你可以尝试grep -Eoe '^\w+' ~/.functions
答案2
根据您的具体需要,有几种解决方案。
如果您可以控制 openssh 服务器配置,您可以在服务器上设置 AcceptENV,然后客户端中的 SendENV 将发送特定的环境变量。
如果这还不够,并且您使用密钥验证,则可以使用authorized_keys条目来运行特定命令,例如加载您已经传输的设置文件。
如果这些都不适合您,那么您只需要使用设置环境的包装器来包装您的脚本/命令。
答案3
恐怕您必须编写一些自定义的东西......类似于针对所涉及的目录和文件的简单 cp 命令的东西。